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 { 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帖子.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |