2012-02-13 43 views
2

我有一個生成藝術的應用程序,我希望它在每幀畫出儘可能多的循環,而不減少幀率。有沒有方法可以告訴屏幕更新/刷新之前還剩多少時間?AS3 - 直到下一幀/屏幕畫多少時間

我想如果我可以近似每個週期需要多少毫秒,那麼我可以運行循環,直到剩餘的時間量小於平均或峯值循環時間,然後讓屏幕刷新,然後運行另一組週期。

+0

這可能還取決於您正在運行應用程序的硬件上。 – 2012-02-13 17:33:45

+0

我想如果你輸出FPS到屏幕並使用Event.RENDER進行更新,你應該能夠看到你是否開始熟悉cpu,它的試驗和錯誤,但是會在不同的硬件上有所不同。 – Neil 2012-02-13 17:46:13

回答

4

如果你希望你的應用在N個運行幀每秒,那麼你可以在一個循環中繪製1/N秒*,其中N是典型的階段幀率(你可以獲取和設置):

import flash.utils.getTimer; 
import flash.events.Event; 

private var _time_per_frame:uint; 

...某處在你的主要構造:

stage.frameRate = 30; 
_time_per_frame = 1000/stage.frameRate; 
addEventListener(Event.ENTER_FRAME, handle_enter_frame); 

...

private function handle_enter_frame(e:Event):void 
{ 
    var t0:uint = getTimer(); 

    while (getTimer()-t0 < _time_per_frame) { 
    // ... draw some stuff 
    } 
} 
  • 請注意,這有點簡化,並且可能會導致比stage.frameRate指定的幀速率更慢,因爲Flash需要一些時間才能在幀之間執行渲染。但是如果你正在blitting(在屏幕上繪製一個位圖),而不是在向量中繪製或向屏幕添加Shapes,那麼我認爲上面應該相當準確。

如果低於預期的要慢,幀率編碼的結果,你可以嘗試,因爲只有走一半分配的時間框架,使另一半爲Flash來呈現這樣簡單的事情:

_time_per_frame = 500/stage.frameRate; 

還有一些FPS監視器可用於在繪圖時監視幀速率。谷歌as3 framerate monitor

+0

將此背後的原理應用於我的代碼中,它效果很好!基本思路:在一幀的開始處獲得時間,並進行循環,直到時間爲1幀的時間後再繪製。 – 2012-03-22 22:07:28

0

將此代碼放入主對象並檢查 - 它將跟蹤每個幀開始之間的時間。

addEventListener(Event.ENTER_FRAME , oef); 
var step:Number = 0; 
var last:Number = Date.getTime(); 
function oef(e:Event):void{ 
    var time:Number = Date.getTime(); 
    step = time - last; 
    last = time; 

    trace(step); 
}