2010-10-21 33 views
3

我使用帶有AS3的Flash CS4。 我想要一個定時器以50毫秒的間隔調用一個函數100次。然而,定時器比它應該花費的時間要長得多,在100次重複之後,這會增加到1677毫秒(1.677秒!)。我在這裏錯過了什麼,或者是不準確的計時器?Flash AS3定時器非常關閉

代碼

function test(event:TimerEvent):void{ 
    trace("GetTimer(): " + getTimer() + " || Timer.currentCount: " + _timer.currentCount); 
} 

var _timer:Timer = new Timer(50, 100); 
_timer.addEventListener(TimerEvent.TIMER, test); 
_timer.start(); 

跟蹤輸出:

GetTimer():74 || Timer.currentCount:1

GetTimer():140 || Timer.currentCount:2

GetTimer():209 || Timer.currentCount:3

GetTimer():275 || Timer.currentCount:4

GetTimer():340 || Timer.currentCount:5

GetTimer():407 || Timer.currentCount:6

GetTimer():476 || Timer.currentCount:7

GetTimer():542 || Timer.currentCount:8

GetTimer():608 || Timer.currentCount:9

GetTimer():677 || Timer.currentCount:10

......

GetTimer():3340 || Timer.currentCount:50

......

GetTimer():6677 || Timer.currentCount:100

感謝您的幫助。

問候,

克里斯

回答

1

有很多因素可以影響一個定時器的準確性。 SWF幀率,其他過程,基本上是您電影的一般環境。

8

請勿使用Timer這麼小的間隔。在Flash中定時並不是一個簡單的話題,請參閱this開始。要測量50 ms,我建議使用getTimer()函數和ENTER_FRAME事件來檢查時間間隔是否已經過去。

+0

getTimer()應使用非常精確是很重要的。 – 2010-10-21 20:13:45

+0

@Muhammad Irfan - getTimer()不比一個Timer對象更精確。 – Allan 2010-10-21 22:51:08

+1

@Allan - getTimer允許手動回調調用,而Timer可以在問題顯示時累積錯誤。 – alxx 2010-10-22 05:40:02

0

如果我是你,我會計算幀之間的毫秒數(1000/fps),並決定每調用一定數量的幀就調用一個函數。是這樣的量超過1:

var counter:int = 0; 
const COUNT_TO_INVOKE: int = 2;//if calling every 3 frames 
function onEnterFrame(e: Event):void{ 
    counter++; 
    if(counter == COUNT_TO_INVOKE){ 
     timerFunction(); 
     counter = 0; 
    } 
} 
+0

真正的FPS可能會在負載下變化。 – alxx 2010-10-21 12:53:16

+1

是的,有時最好跳過一個函數調用,然後繼續加載系統(並放大幀延遲) – www0z0k 2010-10-21 20:18:29