5

私のゲーム エンジンには、定期的に更新する必要があるオブジェクトがあります。たとえば、シーンがアルファを下げる可能性があるので、それを行う間隔を設定します。また、カメラは時々少し揺れる必要があり、これには回転プロパティの補間が必要です。

これらの問題に対処する方法は 2 つあります。

  1. 他のすべてのオブジェクトの update メソッドを呼び出す update() メソッドを用意します。オブジェクトは、最後に更新されてからの時間を追跡し、それに応じて動作します。

  2. setInterval各オブジェクトの update メソッドに対してaを実行します。

最善の解決策は何ですか? またその理由は何ですか?

4

4 に答える 4

4

setIntervalはクロックを保持するのではなく、イベントが発生したときに順序付けするだけです。ブラウザは、イベント間に少なくともある程度の時間を保持する傾向があります。そのため、100 ミリ秒後にすべてを起動する必要がある 10 個のイベントがある場合、最後のイベントが 200 ミリ秒後に発生する可能性があります。(これはテストするのに十分簡単です)。

この意味では、イベントを1 つだけ持つ(そしてすべてのオブジェクトに対して update を呼び出す)が、各オブジェクトに独自の間隔を設定するよりも優れています。他の考慮事項があるかもしれませんが、少なくともこの理由から、オプション 2 は実行不可能です。

setInterval を使用する必要がある時刻をブラウザーがどのように判断するかについて、さらに詳しく説明します。setInterval

于 2012-07-10T22:45:25.743 に答える
1

適切な update() 関数を作成し、適切なフレームレートと少ない負荷を維持するために私が見つけた最良の方法は次のとおりです。

この更新イベントキュー/スケジュールに追加されるupdate()すべての描画可能オブジェクトの独自の関数のある種のキュー/スケジュールをループすることにより、フレームを描画する単一のメソッドを用意します。update()(イベントリスナー)

この方法では、再描画/更新がスケジュールされていないすべてのオブジェクト (メニュー ボタンや十字線など) をループする必要はありません。また、すべての描画可能オブジェクトに対して過剰な間隔で実行する必要はありません。

于 2012-07-10T22:47:33.903 に答える
0

提案された提案されたアルゴリズムは、関連する方法に排他的ではありません。つまり、setIntegal を使用してすべての更新メソッドを呼び出すか、setTimeout を繰り返し呼び出して各オブジェクト自体を更新することができます。

さらに重要なことは、単一のタイマーは複数のタイマー (いずれかのタイプ) よりもオーバーヘッドが少ないということです。タイマーがたくさんある場合、これは非常に重要です。一方、一部のオブジェクトは他のオブジェクトよりも頻繁に更新する必要がある場合や、別のスケジュールに更新する必要がある場合があるため、1 つのタイマーだけでは適していない可能性があるため、最小化するようにしてください。

setTimeout の利点は、次の呼び出しまでの間隔を特定のスケジューリング要件を満たすように調整できることです。たとえば、遅延が発生した場合は、次の呼び出しをスキップしたり、早めたりすることができます。setInterval は一貫したクロックに対してゆっくりとドリフトし、調整の 1 つがより困難になります。

一方、setInterval は 1 回だけ呼び出す必要があるため、タイマーを呼び出し続ける必要はありません。組み合わせで終わる場合があります。

于 2012-07-11T02:23:52.917 に答える
0

update()よりもメソッドを使用することをお勧めしsetIntervalます。

また、実行中のいくつかの setintervals のタイミングは信頼できないと思います。

別の可能性として、ゲームで他に何が起こっているかによって、多数の個別の間隔を使用すると、スコアリングのカウントと比較などで競合状態が発生する可能性があります。

于 2012-07-10T22:48:31.487 に答える