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