3Dグラフィックスでの描画および更新の順序


7

私が見てきたすべてのコードサンプルでは、​​ゲームループは次のようになります。

while(true)
{
   InputAndUpdate();
   Draw();

   SwapBuffers();
}

しかし、これはCPUとGPU間の並列性を破壊しませんか?スワップバッファが呼び出された後、CPUが入力を処理して更新している間、GPUは空の状態で待機します。次に、CPUが描画コマンドの発行を完了すると、GPUのレンダリングが完了するまで待機します。なぜこうならないのですか?:

while(true)
{
   Draw(); //First issue the draw commands
   InputAndUpdate(); //Update while the GPU is busy rendering

   SwapBuffers(); //Now block and wait for the GPU to finish
}

これは私が考えたことがないものです。興味深い質問を1つ。
共産主義者の鴨

最初の1つ。2番目を実行する場合は、最初の場所で入力を取得する方法とV-syncに応じて、入力ラグをフレーム全体で増やす可能性があります。入力ラグを増加させないように常に注意してください
PeterØlstedMay

回答:


5

これは、レンダリングする追加のバックバッファーがない限り当てはまります(ダブルバッファリング)。これにより、実際のバッファースワップが発生するのを待たずにCPUが処理を実行できるようになります(通常、バックバッファーの変更を開始することができなかったため、フロントバッファーにコピーされるまでリスクはありませんでした。レンダリングしたものを破壊する)。描画呼び出しまたはスワップが行われると、要求はGPUが処理できるコマンドのバッファーに入れられ、GPUが背後で実行されている間にCPUが他のことを実行できるようにします。これが、最新のハードウェアが並列処理を実現する方法です。D3Dには、「スワップ」がブロックする前にレンダリングできるフレーム数に制限があると思います(

上記のいずれかの例のようなゲームループの概念はかなり時代遅れです。CPUに複数のプロセッシングユニットを導入すると、1つ以上のスレッドで「更新」作業を行いながら、1つのスレッドでレンダリングを実行できる可能性があります。利用可能なすべてのCPU処理能力を最大化するために、ジョブキューの概念を調べることをお勧めします。


-1

あなたがサイディングしたソリューションは、CPUとGPUが正確に並行動作するようにはせず、それらがお互いを待っている順序を変更するだけです。他の答えは、描画が常に結果をバックバッファに入れ、スワップバッファを使用すると、 CPUとGPUの両方の可能性を最大限に引き出すには、2つの異なるスレッドで描画と更新を呼び出し、CPUが実行している処理に別の2番目のバッファーを使用する必要があります(CPuが更新を生成すると、バッファー2が生成されるため) GPUがバッファー1から読み取り、CPUがバッファー1で動作している場合、GPuはスワップバッファーと同じようにバッファー2を使用し、GPUは既に描画されたフレームの変更を防止します)


@Gajetは、CPU側でもすべてのゲームデータをダブルバッファすることを提案していますか?
Maik Semder、

すべてのデータではなく、移動できるものだけです。したがって、両方のGPU&CPUがCPUbuffer [0]から読み取り、それぞれが計算を行い、結果をメモリバッファー/ CPUBuffer [1]に保存し、両方の作業が完了すると、CPUBuffer [1]から読み取りを開始します
Ali1S232

ゲームエンティティは通常のレンダリングに関連するダブルバッファリングされたプロパティを持っているため、これはやりすぎで非実用的であり、厄介なコードベースになってしまいます。コマンドキューのように、ゲームスレッドからレンダースレッドへの通信には、はるかに簡単なソリューションがあります。これを示唆するための-1
Maik Semder

同意しましたが、CPUとGPUの能力を同時に完全に使用できる唯一の方法だと思います。CPUが生成するフレームデータを終了するたびに、コマンドキューの例は機能しません。すべてのデータをGPUに提供する必要があります。つまり、 GPUが世界を描画している間は、CPUが機能するのを待ってからすべてのバッファーをコピーする必要があることに注意してください。GPUが世界を描画している間は、世界の何も変更されないため、コマンドキューを使用してもCPUとGPUに変更はありません。お互いを待っています。
Ali1S232

一方が他方が完了するのを待つという事実は、それらが並行して実行されないことを意味するわけではありませんが、レンダリングとゲーム更新を同期する必要があるため、最初に完了するものは待つ必要があります。しかし、それらは完全に並行して実行されます。したがって、ダブルバッファの提案はそこにない問題を解決します。
Maik Semder、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.