加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

actionscript-3 – 异步运行AS3功能

发布时间:2020-12-15 07:25:18 所属栏目:百科 来源:网络整理
导读:我在网上学习一些教程时遇到了一些麻烦,因此我在这里问. (使用ActionScript 3,Adobe AIR和Flash Professional CS5.5) 我在我的AS3文档类中有一个非常繁重的函数,我需要异步运行,所以它不会停止MovieClip本身的代码(不要问我为什么,它只需要那样.) 那么,简单
我在网上学习一些教程时遇到了一些麻烦,因此我在这里问. (使用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条跟踪.它准备运行部分,但这不是异步.我们现在可以轻松更改功能,因此功能会随着时间的推移而运行.
我为此使用了setTimeout.您也可以使用ENTER_FRAME事件监听器或Timer类,但为了这个例子,我试着保持清楚.

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实用程序类非常有帮助,它可以测量计算实际花费的时间,并改变时间本身.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读