2011-01-11 32 views

回答

1

我認爲這是不可能考慮到閃存架構。基本上,在閃光燈的每個步驟分爲以下步驟:(還有比這更,他們可能有不同的名稱,但總體讓我們說,它是如何工作):

  1. 輸入幀事件的執行。
  2. 照亮並執行其他事件(操作系統,定時器,輸入,東西)。
  3. 繪製到屏幕上。

因此,假設您的應用程序工作在20 FPS,每50ms一幀。您的輸入框架事件需要10ms,繪製屏幕需要10ms,因此在每個框架中,您只剩下30ms的時間來捕捉定時器事件。如果你的計時器是1ms,每幀20次,它將不得不等待輸入幀和繪圖完成。非常糟糕的是,考慮到所有這些階段可能需要更多時間,並且Flash有這種趨勢會不時出現,而沒有任何明顯的原因,所以你的情況更糟。

當然,我可能是錯的地方,但我不認爲這是可能做到這一點,除非你知道一些祕密的成分。

2

很明顯,你可以措施延遲不夠準確,所以我想你想火的延遲後事件和你的分辨率是不夠好。

是,Timer類是有點可怕。但是你可以使用一個技巧:

如果需要2ms的(例如)的延遲,只需使用一個while循環:

var startTime:Number = getTimer(); 
while(getTimer() < startTime + 2) { 
    // whee 
} 
doStuff(); 

它應該是不言而喻的doStuff不會執行,直到後2MS。

很明顯,不要將此用於比幀長度更長的延遲,因爲這會導致玩家變得呆滯。使用計時器關閉,然後在足夠近的時候使用這個技巧。你會得到更好的解決方案。

如果您需要觸發多個事件,則需要提前對它們進行排序。

1

不能完全確定,你與你的問題會和情況各不相同,但很多在Flash中與時間相關的問題,可以通過以下操作來解決:

  1. 一些幀添加到您的主時間軸。通常,我加兩到三秒。
  2. 使主時間線在本節中循環。
  3. 創建一個只包含沉默的真實音頻文件(真正的音頻黑色)。一秒鐘的沉默通常很好。
  4. 將其導入到庫中。
  5. 將此添加到您填充區域的主時間線中。設置循環計數,以便始終播放。 確保您設置爲同步到流

這有效地導致Flash Player兌現主時間軸的時間(因爲它的音頻已同步到流),而不是試圖跟上每個圖形幀。

通常我這樣做是爲了確保在動畫在不同的機器同樣的速度打球,但我還用它來修復wonkiness與計時器。

0

我已經遇到這個前段時間在AS2,但我發現AS3是一個LO *更可靠。

我和AS2做什麼設置定時器運行100ms左右小於否則它將只有一次。然後,我會把它放在前面描述的那個getTimer()循環中,直到它達到所需的時間,然後我會讓它做任何事情。在99%的案例中,這不是一個好主意。循環使用了大量的CPU,並且如果您的事件可能會延遲超過100毫秒,具體取決於CPU負載。

總而言之,在運行AS3最簡單的計時器測試後我發現,偏移量是相當一致的,當一個小的CPU負載相當可靠下運行。

儘可能的去解釋,它更多的意見,我的隨身攜帶用來計數的累計時間漂移的邏輯問題。

作者增加了所有的差異,所以假設getTimer在1000,2002,3002處發生事件。 兩次延遲2ms,這並不意味着第二個事件是4ms延遲,它是2ms晚了,與之前的事件相比,它相距1000毫秒,所以不會遲到。所以,雖然數學是有道理的,2 + 2 = 4,我真的不明白這是如何有用的任何方式。

當我跑我的測試: VAR延遲:INT = 1000;

var myTimer:Timer = new Timer(delay, 0); 

function timerHandler($evt:TimerEvent){ 
    trace(getTimer()); 
} 

myTimer.addEventListener(TimerEvent.TIMER, timerHandler); 

myTimer.start(); 
trace(getTimer()); 

我得到這個幾秒鐘,在運行一些視頻:

15011 
16011 
17011 
18054 
19054 
20054 
21054 
22054 
23057 
24054 
25054 
26054 
27054 
28011 
29011 
30011 
31011 
... 
135047 
136194 <- big one here 
137246 - and here 
138167 - 
139242 - 
140173 - 
141016 <- back 
142018 <- normalized 
143018 
144018 
145019 
146018 
147018 

有趣的是,看到這種 「正常化」。它有時會一直下降54ms,然後下降到27ms,然後下降到18ms等等,並在圍繞另一個值正常化之前停留一段時間。但是這個價值不是累積的,而是非常接近基數。即。偏移量不會繼續增加。如果您爲單次使用重複創建事件,則會看到累計差異。

相關問題