2

I'm writing single threaded game engine for 2D games. Right now my game loop looks rougly like this:

  1. Update game logic
  2. Update physics
  3. Handle collisions
  4. Render scene

I'm using OpenGL for rendering. I'm wondering about 'Render scene' step position in game loop. There is a SwapBuffers() call on the end of the 'Render scene' step, so CPU is blocked until all rendering is finished. What do you think about this game loop:

  1. Render scene (previous frame)
  2. Logic, physics, collisions
  3. Swap buffers

This approach will bring better parallelism between CPU and GPU. Am I right?

4

3 に答える 3

2

私はこれがすでに答えられていることを知っていますが、私は何かを追加する必要があります。

あなたがここで言及すること

Render scene (previous frame)
Logic, physics, collisions
Swap buffers

フレームレートが上がる可能性がありますが、レイテンシも大幅に増加します。ユーザーがボタンを押すと、結果は最初に2フレーム以上後、最悪の場合4フレーム後までに表示されます。

より良いゲームループは次のとおりです。

-Handle Input, move character etc. (This takes virtually no time)
-Render
-Do the heavy calculations (AI, physics)
-Swap Buffers
于 2012-05-21T16:05:52.223 に答える
1

実際、それほど大きな違いはありません。ゲームをループさせる方法はたくさんありますが、最も重要なことは、3つの主要なトピックを分離しておくことです。

-入力-
ロジック-
レンダリング

並行して実行されないため、それぞれの間の時間は常に同じになります。

于 2012-05-21T03:32:09.347 に答える
1

レンダリングはOpenGL、GPUで非同期に行われるため、CPUがロジック/物理などを更新している間にGPUがレンダリングを終了する可能性は確かにあると思います。バッファの交換は、すべてのコマンドが実行されるまで待機するため、最後に実行するとパフォーマンスが向上する可能性があります。

ただし、確認する唯一の方法はそれを試すことです。CPUがボトルネックである場合、それはとにかく問題ではありません。(GPUはCPUがコマンドを送信するよりも速くレンダリングします-これは高いFPSで発生する可能性があり、その場合、FPSはとにかく許容できるため、通常はゲーマーにとって「ボトルネック」とは呼ばれません)

于 2012-05-21T14:50:28.173 に答える