6

私はマルチスレッドレンダリングについて多くのことを読んできました。フレームレートを高速化し、より多くのものをレンダリングするために、スレッドを使用して GPU に作業を送信するためのあらゆる種類の奇妙で素晴らしいスキームを提案してきましたが、私は全体で少し概念的な問題を抱えており、私はあなたがどう思うかを見るために、私はここで教祖によってそれを動かそうと思いました.

私の知る限り、GPU での同時実行の基本単位はワープです。つまり、ジオメトリ サブミッション レベルの上位ではなく、ピクセル レベルで下位にあるということです。したがって、GPU での同時実行の単位がワープであることを考えると、複数のスレッドが互いの送信を台無しにしないように、ドライバーをミューテックスでかなり厳密にロックダウンする必要があります。この場合、D3D または OpenGL マルチスレッド プリミティブにコーディングするメリットがどこにあるのかわかりません。

マルチスレッド シナリオで GPU を使用する最も効率的な方法は、送信する前に行う作業のバッチをまとめて収集する、より高い抽象的なレベルで行うことでしょうか? つまり、複数のスレッドからのコマンドをランダムにインターリーブするのではなく、単一のブロックが複数のスレッドからの作業を受け入れると考えていましたが、レンダラーに送信されるにパフォーマンスを向上させるために物事が順序付けられていることを確認するためのインテリジェンスが内部に少しあります。複数のスレッドで作業したい場合は、はるかに大きな利益が得られます。

では、実際の API での D3D/OpenGL マルチスレッド レンダリングのサポートはどこにあるのでしょうか?

私の混乱を助けてください!

4

2 に答える 2

8

あなたの質問は、「レンダラーをマルチスレッドにする」と「マルチスレッドレンダリング」の違いの誤解から来ています。

「レンダラー」、より正確には「レンダリング システム」は、API に対してレンダリング コマンドを発行するだけではありません。メモリをシャッフルする必要があります。グラフィックス メモリにテクスチャを動的にロードする必要がある場合があります。何らかのレンダリング プロセスの後で、データを読み戻す必要がある場合があります。などなど。

レンダラーをマルチスレッド化するということは、まさにそれを意味します。つまり、レンダリング システムが複数のスレッドを利用できるようにするということです。これは、レンダリングするオブジェクトのリストを構築するようなシーン グラフ管理タスクをスレッド化する場合があります (フラスタム カリング、BSP、ポータルなど)。これは、必要に応じてテクスチャをスワップインおよびスワップアウトしたり、ディスクからロードしたりする、テクスチャストレージ管理専用のスレッドを持つことができます。これは、一連のレンダリング コマンドを他のタスクと並行して作成する、コマンド リストの D3D11 の場合と同様です。

実際のレンダリング コマンドを API に送信するレンダリングプロセスは、スレッド化されていません。glDraw*通常、基本または::DrawIndexedPrimitive作業を担当するスレッドが 1 つあります。D3D11 コマンド リストを使用すると、これらのコマンドのシーケンスを作成できますが、他のレンダリング コマンドと並行して実行することはできません。実際にコマンド リストを発行するのは、レンダリング スレッドとメイン コンテキストです。コマンドリストは、そのリストをよりスレッドフレンドリーにまとめるためのものです。

于 2013-05-28T14:05:27.173 に答える
1

Direct3D 11 では、通常、ワーカー スレッドから描画呼び出しを行う遅延コンテキストを作成します。作業が完了し、レンダリングの準備が整ったら、各遅延コンテキストからコマンド リストを生成し、即時 (フロント スレッド) コンテキストで実行します。これにより、ドローコールなどの正しい順序を維持しながら、ドローコールを複数のスレッドで構成できます。

于 2013-05-28T14:05:33.200 に答える