我在理解网上的一些教程时遇到了一些麻烦,所以我在这里问。(使用ActionScript 3、Adobe AIR和Flash Professional CS5.5)
我的AS3文档类中有一个非常繁重的函数,需要异步运行,所以它不会停止MovieClip本身上的代码(不要问我为什么,它只需要这样)。
所以,简单地说,我如何异步运行这个文档类函数(StartNow)?代码可以放在document类中,也可以放在电影剪辑中,我不在乎放在哪里。这似乎是一种相对简单和普遍的做法,但我的所有研究都没有挖掘出任何东西。
谢谢!
发布于 2012-11-22 17:47:47
在Flash中没有异步运行函数这样的东西,除非你想使用Workers (就像Vesper说的那样),否则你必须自己去做。Worker为您提供了一个单独的进程。否则,您必须将计算分成几个部分。这就是你怎么做的:
成像“跟踪”是一项非常繁重的操作。这不是,只是为了说明一下。这个简单的for循环在帧上运行,并导致较低的帧率,因为它都是在帧实际渲染之前计算出来的。
for(var i:int = 0; i < 1000; i ++)
{
trace(i); // heavy calculation here
}因此,您必须将计算分成几个部分,并将其拆分,以便能够随着时间的推移运行计算。
要做到这一点,您必须创建一个函数,该函数每次只占用循环的一部分:
calculatePart(0, 1000, 20);
function calculatePart(startIndex:int, endIndex:int, amountPerRun:int)
{
for(var i:int = startIndex; (i < startIndex + amountPerRun) || (i < endIndex); i ++)
{
trace(i); // heavy calculation here
}
if (i < endIndex)
{
calculatePart(i, endIndex, amountPerRun);
}
}这实际上与第一个代码中的简单for-loop函数相同,它还输出1000个轨迹。它已经准备好分部运行,但这还不是异步的。我们现在可以很容易地更改函数,这样函数就可以随时间运行。为此,我使用setTimeout。您也可以使用ENTER_FRAME事件侦听器或Timer类来实现这一点,但出于本例的考虑,我尽量保持清晰。
calculatePart(0, 1000, 20, 100);
function calculatePart(startIndex:int, endIndex:int, amountPerRun:int, timeBeforeNextRun:Number)
{
for(var i:int = startIndex; (i < startIndex + amountPerRun) && (i < endIndex); i ++)
{
trace(i); // heavy calculation here
}
if (i < endIndex)
{
setTimeout(calculatePart, timeBeforeNextRun, i, endIndex, amountPerRun, timeBeforeNextRun);
}
}如您所见,我添加了一个timeBeforeNextRun参数。如果运行该示例,您可以看到在输出20个跟踪之前需要100毫秒。
如果你把它设置得很低,计算会被试得非常快,但是你不能仅仅通过尝试在更短的时间内做更多的事情来获得额外的速度。你必须使用时间和数量变量,你可以测试哪一个实际提供了更好的性能(或更少的延迟)。
// more time between a run, less calculations per run
calculatePart(0, 1000, 30, 10);
// more calculations per run, more time between a run
calculatePart(0, 1000, 100, 30);希望这能有所帮助。
如果您想使用更智能的时间计算,我发现this实用程序类非常有用,它测量计算实际花费了多少时间,并更改时间本身。
发布于 2012-11-22 15:30:51
如果您的目标是Flash player 11.4,则可以为Worker对象分配如此繁重的功能。我没有FP11,最终做了一个程序化的生成器,每次迭代总共持续300秒以上。我不得不使用一种基于状态的方法,与enter frame listener结合使用。在我的案例中,整个复杂生成过程被分成几个逻辑块,这些逻辑块足够小,可以在合理的时间跨度内完成,并且有一个跟踪当前生成阶段的变量。因此,当另一个帧调用生成函数时,它从该变量中读取最后完成的步骤,对它的数据集执行一个额外的步骤,存储新值并退出该帧。实际上,这不是一个纯粹的异步过程,而是一种伪多任务方法,如果使SWF延迟的函数是可拆分的,那么这种方法很适合您。
https://stackoverflow.com/questions/13507609
复制相似问题