我有一個生成藝術的應用程序,我希望它在每幀畫出儘可能多的循環,而不減少幀率。有沒有方法可以告訴屏幕更新/刷新之前還剩多少時間?AS3 - 直到下一幀/屏幕畫多少時間
我想如果我可以近似每個週期需要多少毫秒,那麼我可以運行循環,直到剩餘的時間量小於平均或峯值循環時間,然後讓屏幕刷新,然後運行另一組週期。
我有一個生成藝術的應用程序,我希望它在每幀畫出儘可能多的循環,而不減少幀率。有沒有方法可以告訴屏幕更新/刷新之前還剩多少時間?AS3 - 直到下一幀/屏幕畫多少時間
我想如果我可以近似每個週期需要多少毫秒,那麼我可以運行循環,直到剩餘的時間量小於平均或峯值循環時間,然後讓屏幕刷新,然後運行另一組週期。
如果你希望你的應用在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
}
}
如果低於預期的要慢,幀率編碼的結果,你可以嘗試,因爲只有走一半分配的時間框架,使另一半爲Flash來呈現這樣簡單的事情:
_time_per_frame = 500/stage.frameRate;
還有一些FPS監視器可用於在繪圖時監視幀速率。谷歌as3 framerate monitor。
將此背後的原理應用於我的代碼中,它效果很好!基本思路:在一幀的開始處獲得時間,並進行循環,直到時間爲1幀的時間後再繪製。 – 2012-03-22 22:07:28
將此代碼放入主對象並檢查 - 它將跟蹤每個幀開始之間的時間。
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);
}
這可能還取決於您正在運行應用程序的硬件上。 – 2012-02-13 17:33:45
我想如果你輸出FPS到屏幕並使用Event.RENDER進行更新,你應該能夠看到你是否開始熟悉cpu,它的試驗和錯誤,但是會在不同的硬件上有所不同。 – Neil 2012-02-13 17:46:13