我正在制作一个游戏(一个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帖子.