2

AS3 で 60fps のフレーム レートに依存しないモーションを実現するのに問題があります。フレームごとに、前のフレームからの時間を測定し、それをアキュムレータに追加します。アキュムレータが目標時間 (16.666 ミリ秒 (60 fps)) よりも大きい場合、フレームがシミュレートされます。

問題は、AS3 getTimer() がミリ秒単位の時間を返すだけであることです。

私が取得するデルタ時間は、多くの場合、最初のフレームで 16 ミリ秒、2 番目のフレームで 16 ミリ秒、3 番目のフレームで 18 ミリ秒であり、このパターンが繰り返されます。これは平均して 16.666 になります。しかし、最初のフレームではターゲット時間 (16 < 16.666) よりも低いため、フレームはシミュレートされません。2 番目のフレームでは、アキュムレータはターゲット時間よりも高くなりますが、2 倍よりわずかに少ないため、1 フレームがシミュレートされます。3 番目のフレームでは、18 ミリ秒でアキュムレータがターゲット時間の 2 倍にプッシュされるため、2 つのフレームがシミュレートされます。

そのため、フレームがレンダリングされず、次に 1 つ、次に 2 つ、次に何もレンダリングされず、次に 1 つ、次に 2 つという非常にぎくしゃくした動きが得られます。

どうすればこれを回避できますか?

4

1 に答える 1

1

うわー...私はそれを見つけたのは私だけだと思った。

はい、AS3 のタイマー クラスは正確ではありません。16 ミリ秒ごとにのみトリガーされるため、大きな問題が発生することがあります。

1000 ミリ秒で 2048 アクションを見たい場合: FlashText マークアップ言語

(これをテストするには、実行に 1 ミリ秒かかるメソッドが必要です - 統計だけでも)

違いに注意してください。

正しい: 1000ms | timer=0 == 1000 アクション

AS3 : 1000ms | timer=0 == 62.5 アクション

次のように機能するクラスを作成できました。

正しい: 1000ms | timer=0 == 1000 アクション

再形成タイマー: 1000ms | timer=0 == 1024 アクション

ノート:

  1. ミリ秒ごとにアクションを起動しません

  2. 16ミリ秒間隔の間のアクションに追いつきます

  3. ACTION(私が使用する方法)はメソッド呼び出しであり、各メソッド呼び出しは独自の本体を持つことができます

これを作成するために使用した方法論はキャッチアップでした...基本的に最初のタイマー イベントは 16 ミリ秒で起動します...タイマー クラスが再び起動する前に、独自のアクションを起動するための完全な 16 ミリ秒相当のコード時間があることがわかっています。サブアクションを挿入する場所...

私が作成できた最高は、1000 ミリ秒で 2048 アクションでした... 1 ミリ秒あたり 2 アクション以上です

さて...問題に戻ります 。0ms タイマー イベントをトリガーする方法はありません。私の解決策に基づいて、タイマーが起動する前に最初の 16 ミリ秒の遅延を回避したい場合は、現在のシステム プロセスに応じて 2 ミリ秒以内に発生するイベントをディスパッチできます。

考えられる解決策 16 ミリ秒以内に独自のアクションをスローするという私のアプローチを取る場合は、独自のタイマー クラスを作成できます。発射されたときに、16ms未満の時間にイベントを使用してください...さらに15回発射します-笑。基本的に、16 ミリ秒の間に独自のデルタを作成できます。

于 2013-02-12T20:10:49.573 に答える