flex – AS3:getTimer()方法和Timer类的准确度如何?

前端之家收集整理的这篇文章主要介绍了flex – AS3:getTimer()方法和Timer类的准确度如何?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在制作一个游戏(一个shmup),我开始质疑ActionScript中计时器的准确性.当然,当你想要在几秒或几秒的时间内完成时间时,它们是足够准确的,但是当你达到更精细的范围时,它似乎表现得非常糟糕.这使得像太空​​船每秒发射一百个激光器这样的事情变得非常困难.

在下面的示例中,我测试了间隔在1000个计时器刻度之间的时间长度(平均)为30ms.一次又一次,结果是~35-36ms.减少时间,我发现定时器延迟的时间为~16-17ms.这给了我一个~60的最大fps,这在视觉上是很好的,但也意味着我不可能每秒发射超过60个激光:-(.我在100和1000次循环中运行了几次这个测试,但对于这两个30ms测试和1ms测试结果没有变化.我最后打印到textField,因为使用trace()并在调试模式下启动swf似乎会对测试产生负面影响.所以我想知道的是:

>这个测试是衡量Timer类性能的一个不错的指标,还是我的结果有问题?
>这些结果会在其他机器上发生巨大变化吗?

我知道这取决于getTimer()方法的准确性,但我在这个主题上发现的讨论通常围绕getTimer()在更大间隔内的准确性.

package 
{
import flash.display.Sprite; import flash.events.TimerEvent; import flash.text.TextField; import flash.utils.getTimer; import flash.utils.Timer;
public class testTimerClass extends Sprite
{
    private var testTimer:Timer = new Timer(30,1000);
    private var testTimes:Array = new Array();
    private var testSum:int = 0;
    private var testAvg:Number;
    private var lastTime:int;
    private var thisTime:int;

    public function testTimerClass()
    {
        testTimer.addEventListener(TimerEvent.TIMER,step);
        testTimer.addEventListener(TimerEvent.TIMER_COMPLETE,printResults);
        lastTime = getTimer();
        testTimer.start();
    }

    private function step(event:TimerEvent):void
    {
        thisTime = getTimer();
        testTimes.push(thisTime - lastTime);
        lastTime = thisTime;
    }

    private function printResults(event:TimerEvent):void
    {
        while (testTimes.length > 0)
        {
            testSum += testTimes.pop();
        }
        testAvg = testSum / Number(testTimer.repeatCount);              
        var txtTestResults:TextField = new TextField();
        txtTestResults.text = testAvg.toString();
        this.addChild(txtTestResults);  
    }       
}

}

我想最好的选择是在不同位置的同一帧中绘制多个激光器,避免使用多个Timer对象.

编辑:我使用stage.frameRate更改渲染frameRate并在几个帧速率上运行测试,但没有变化.

解决方法

Tinic Uro(Flash Player工程师)不久前写了一篇关于这个问题的 interesting blog帖子.

猜你在找的Flex相关文章