actionscript-3 – 异步运行AS3功能
我在网上学习一些教程时遇到了一些麻烦,因此我在这里问. (使用ActionScript 3,Adobe AIR和Flash Professional CS5.5)
我在我的AS3文档类中有一个非常繁重的函数,我需要异步运行,所以它不会停止MovieClip本身的代码(不要问我为什么,它只需要那样.) 那么,简单地说,我如何异步运行这个文档类函数(StartNow)?代码可以放在文档类或movieclip上,我不在乎哪里.这似乎是一种相对简单和普遍的做法,但我所有的研究都没有挖掘任何东西. 谢谢! 解决方法
在Flash中没有异步运行函数,你必须自己动手,除非你想使用Workers(如Vesper所说).工人为您提供单独的流程.否则,您必须将计算分解为多个部分.这是你如何做到的:
成像’痕迹’是一项非常繁重的操作.它不是,而只是为了说明.这个简单的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循环功能相同,它还输出1000条跟踪.它准备运行部分,但这不是异步.我们现在可以轻松更改功能,因此功能会随着时间的推移而运行. calculatePart(0,20,100); function calculatePart(startIndex: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,amountPerRun,timeBeforeNextRun); } } 如您所见,我添加了timeBeforeNextRun参数.如果运行该示例,则可以看到在输出20条迹线之前需要100毫秒. 如果将其设置得非常低,则会尝试非常快速地进行计算,但是如果您在更短的时间内尝试做更多的事情,则无法获得额外的速度.你必须使用时间和数量变量,你可以测试哪一个实际上提供了更好的性能(或更少的滞后). // more time between a run,less calculations per run calculatePart(0,30,10); // more calculations per run,more time between a run calculatePart(0,100,30); 希望这可以帮助. 如果你想更聪明地计算时间,我发现this实用程序类非常有帮助,它可以测量计算实际花费的时间,并改变时间本身. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |