私はジェネレーティブ アート アプリを持っています。フレームレートを下げずに、各フレームでできるだけ多くのサイクルを描画したいと考えています。画面が更新/リフレッシュされるまでの残り時間を知る方法はありますか?
各サイクルにかかるミリ秒数を概算できれば、残り時間が平均サイクル時間またはピークサイクル時間よりも少なくなるまでサイクルを実行し、画面を更新してから、別の一連のサイクルを実行できます。
私はジェネレーティブ アート アプリを持っています。フレームレートを下げずに、各フレームでできるだけ多くのサイクルを描画したいと考えています。画面が更新/リフレッシュされるまでの残り時間を知る方法はありますか?
各サイクルにかかるミリ秒数を概算できれば、残り時間が平均サイクル時間またはピークサイクル時間よりも少なくなるまでサイクルを実行し、画面を更新してから、別の一連のサイクルを実行できます。
アプリを 1 秒あたり 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 モニターもあります。Google as3 フレームレート モニター.
このコードをメイン オブジェクトに配置してチェックします。各フレーム開始間の時間をトレースします。
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);
}