あなたの質問を読み直した後、私はあなたが見逃しているトリックだと思います(より高いリフレッシュシステムで実行するとゲームロジックの実行が速くなるというコメントに基づいて)、「デルタ」に基づいて実際に更新をスケーリングすることです" レンダリングにかかる時間。Andrei Bârsan はこれについて上記で言及していますが、デルタの使用方法について少し詳しく説明したいと思います。
たとえば、ゲームの render() 内で、最初に entityUpdate(delta) を呼び出します。これは、ゲーム内のすべてのオブジェクトを、時間内に移動した距離「デルタ」によってスケーリングされて更新および移動します (レンダリングせず、移動するだけです)。それらの位置変数)。次に、更新によって発生したすべての衝突を解決する entityManageCollisions(delta) を呼び出し、最後に entityDraw(batch, delta) を呼び出します。これは、delta を使用してスプライト アニメーションの適切なフレームを取得し、実際にすべてを画面に描画します。
私はエンティティ/コンポーネント/システム モデルのバリアントを使用するので、すべてのエンティティを一般的に処理します。上記のメソッド呼び出しは本質的に、コンポーネントの特定の組み合わせを持つエンティティに作用する「システム」です。
つまり、デルタ (render() に渡されるパラメーター) をすべてのロジックに渡すと、最後の呼び出しからの経過時間に基づいて物事をスケーリング (適切な距離だけエンティティを移動) できるようになります。これには、エンティティの単位/秒に基づいて速度を設定する必要があります。これは、エンティティをスケーリングする値を渡すためです。これは秒の何分の一かです。数回実行して結果を試してみると、良い状態になります。
また、注意: デルタ タイマーは最後のレンダー コール以降の時間を累積し続け、エンティティが画面全体を横切って (さらには境界を越えて) 飛び回るため、インタラクティブなデバッグ セッションで気が狂ってしまいます。 1 秒未満の更新を取得しますが、30 秒 (またはデバッガーをステップ実行するのに費やした時間) を過ぎてしまう可能性があるため、render() の一番上に次の行があります。delta = 0.016036086f;
(その数値は私の開発ワークステーションからのサンプル デトラであり、適切な結果が得られるようです。テストの実行中にコンソールに書き込むことで、ビデオ システムの典型的なデルタが何であるかをキャプチャし、必要に応じてその値を代わりに使用できます。 ) ビルドを展開するためにコメントアウトしますが、デバッグ時にはコメントを外したままにしておきます。そのため、デバッガーで物事を見るのに費やす時間に関係なく、各フレームは一定量ゲームを進めます。
幸運を!