2013-02-12 68 views
2

我在60fps下在AS3中實現幀速率獨立運動時遇到問題。每幀測量自上一幀以來的時間,將其添加到累加器,並且如果累加器大於我的目標時間(即16.666ms(60fps)),則會模擬一幀。在AS3中平滑60fps幀速率獨立運動

問題是,AS3 getTimer()只返回一個以毫秒爲單位的時間。

我得到的增量時間往往是第一幀16ms,第二幀16ms,然後是第三幀18ms,然後重複這個模式。這個平均值達到了16.666。但是在第一幀中,它低於目標時間(16 < 16.666),所以沒有模擬幀。在第二幀中,累加器高於目標時間,但略低於其兩倍,因此模擬了一幀。對於第三幀18ms推動累加器超過目標時間的兩倍,因此模擬兩幀。

所以我得到這個非常生澀的運動,其中沒有框架呈現,然後一個,然後兩個,然後沒有,然後一個,然後兩個,這繼續。

我該如何解決這個問題?

+1

我建議閱讀這篇文章:http://www.craftymind.com/2008/04/18/updated-elastic-racetrack-for-flash-9-and-avm2/ – 2013-02-12 21:07:51

+1

你爲什麼使用Timer而不是Event .ENTER_FRAME? – 2013-02-12 21:11:41

回答

1

哇......我以爲我只是一個誰發現了。

是的,AS3中的定時器類不準確。它只會觸發每個〜16ms,這有時會導致主要問題。

如果想看到1000毫秒2048操作:FlashText Markup Language

(爲了測試這一點,你需要這需要1ms的執行方法 - 只是甚至統計)

注意到其中的差別:

正確:1000ms |定時器= 0 == 1000動作

AS3:1000ms |定時器= 0 == 62。5個行動

我能寫的是這樣的一類:

正確:1000毫秒|定時器= 0 == 1000動作

RESHAPE TIMER:1000ms |計時器= 0 == 1024個行動

注:

  1. 火每毫秒

  2. ○行爲趕上16毫秒之間的行動區間

  3. 一個動作(我用我的方式t)是一個方法調用,每一個方法調用都可以有它自己的身體

我用來創建,這是追趕...基本上第一個定時器事件就會觸發在16毫秒的方法...我們知道我們有足夠的16ms的代碼時間在定時器類再次觸發之前觸發我們自己的行爲 - 那就是您注入子動作的地方...

我能夠產生的最高次​​數是2048次動作,持續1000ms。 .. 超過2動作每ms

現在回到您的問題 有沒有辦法觸發0ms計時器事件。根據我的解決方案,如果您想在計時器觸發前繞過第一個16ms的延遲時間,您可以根據當前的系統進程調度一個在2ms內觸發的事件。

可能的解決方案 如果你把我的16毫秒內投擲自己的操作方法,那麼你就可以建立自己的定時器類。使用事件的時間不足16毫秒,當被解僱時......再射擊15次 - 大聲笑。基本上,你可以在16ms之間創建你自己的增量。