2

私はジェネレーティブ アート アプリを持っています。フレームレートを下げずに、各フレームでできるだけ多くのサイクルを描画したいと考えています。画面が更新/リフレッシュされるまでの残り時間を知る方法はありますか?

各サイクルにかかるミリ秒数を概算できれば、残り時間が平均サイクル時間またはピークサイクル時間よりも少なくなるまでサイクルを実行し、画面を更新してから、別の一連のサイクルを実行できます。

4

2 に答える 2

4

アプリを 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 がフレーム間でレンダリングを実行するのに時間がかかるため、stage.frameRate で指定されたフレームレートよりも遅いフレームレートになる可能性があることに注意してください。しかし、ベクトルで描画したり、画面にシェイプを追加したりするのではなく、ブリット (画面上のビットマップに描画) している場合、上記は実際にはかなり正確であると思います。

コードが望ましいフレームレートよりも遅い場合は、フレームに割り当てられた時間の半分だけを取り、残りの半分を Flash のレンダリングに任せるという単純な方法を試すことができます。

_time_per_frame = 500 / stage.frameRate;

描画中にフレームレートを監視するために使用できる FPS モニターもあります。Google as3 フレームレート モニター.

于 2012-02-13T19:01:13.147 に答える
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);
}
于 2012-02-13T18:30:30.467 に答える