8

私はLibgdxを学んでいて、renderメソッド中にゲームロジックを更新することについていくつか質問があります。

理想的には、ゲームロジックとレンダリングを別々に保ちたいと思います。この理由は、システムでFPSが高い場合、ゲームループがより速く「実行」されるためです。

私が探しているのは、エクスペリエンスを一定に保ち、更新を制限する可能性があることです。a)DeltaTimeを介してレンダリングの更新を制限するb)Deltatimeを介してゲームロジックの更新を制限する方法についてのチュートリアルを教えてくれる人がいれば。

ありがとうございました :)

4

2 に答える 2

8

あなたの質問を読み直した後、私はあなたが見逃しているトリックだと思います(より高いリフレッシュシステムで実行するとゲームロジックの実行が速くなるというコメントに基づいて)、「デルタ」に基づいて実際に更新をスケーリングすることです" レンダリングにかかる​​時間。Andrei Bârsan はこれについて上記で言及していますが、デルタの使用方法について少し詳しく説明したいと思います。

たとえば、ゲームの render() 内で、最初に entityUpdate(delta) を呼び出します。これは、ゲーム内のすべてのオブジェクトを、時間内に移動した距離「デルタ」によってスケーリングされて更新および移動します (レンダリングせず、移動するだけです)。それらの位置変数)。次に、更新によって発生したすべての衝突を解決する entityManageCollisions(delta) を呼び出し、最後に entityDraw(batch, delta) を呼び出します。これは、delta を使用してスプライト アニメーションの適切なフレームを取得し、実際にすべてを画面に描画します。

私はエンティティ/コンポーネント/システム モデルのバリアントを使用するので、すべてのエンティティを一般的に処理します。上記のメソッド呼び出しは本質的に、コンポーネントの特定の組み合わせを持つエンティティに作用する「システム」です。

つまり、デルタ (render() に渡されるパラメーター) をすべてのロジックに渡すと、最後の呼び出しからの経過時間に基づいて物事をスケーリング (適切な距離だけエンティティを移動) できるようになります。これには、エンティティの単位/秒に基づいて速度を設定する必要があります。これは、エンティティをスケーリングする値を渡すためです。これは秒の何分の一かです。数回実行して結果を試してみると、良い状態になります。

また、注意: デルタ タイマーは最後のレンダー コール以降の時間を累積し続け、エンティティが画面全体を横切って (さらには境界を越えて) 飛び回るため、インタラクティブなデバッグ セッションで気が狂ってしまいます。 1 秒未満の更新を取得しますが、30 秒 (またはデバッガーをステップ実行するのに費やした時間) を過ぎてしまう可能性があるため、render() の一番上に次の行があります。delta = 0.016036086f;(その数値は私の開発ワークステーションからのサンプル デトラであり、適切な結果が得られるようです。テストの実行中にコンソールに書き込むことで、ビデオ システムの典型的なデルタが何であるかをキャプチャし、必要に応じてその値を代わりに使用できます。 ) ビルドを展開するためにコメントアウトしますが、デバッグ時にはコメントを外したままにしておきます。そのため、デバッガーで物事を見るのに費やす時間に関係なく、各フレームは一定量ゲームを進めます。

幸運を!

于 2013-05-16T17:08:21.323 に答える
3

これまでの答えは、並列スレッドを使用していません-私は過去にこの質問を自分自身で受けましたが、それに対してアドバイスを受けました-link。最初にワールドの更新を実行し、フレームに十分な時間が残っていない場合はレンダリングをスキップすることをお勧めします。それでも、すべてをスムーズに進め、遅延を防ぐために、デルタ タイムを使用する必要があります。

このアプローチを使用する場合、X 回を超える連続フレーム スキップが発生しないようにすることが賢明です。フレームに割り当てられた合計時間、これはレンダリングがまったく行われないことを意味する可能性があります - そしてそれはあなたが望むものではありません. スキップするフレーム数を制限することで、更新がスムーズに実行されるようになりますが、処理するロジックが多すぎてもゲームがフリーズしないことも保証されます。

于 2013-01-09T22:39:38.250 に答える