0

xna ゲームに各ライトをループする照明システムがあり、これらのライトをすべてのライトを含む最終的なライト マップに追加します。

これらのライトを作成するプロセスには、エフェクト/シェーダーと描画を使用してターゲットをレンダリングする、graphics.device.clear を使用してレンダリング ターゲットをクリアするなど、グラフィックス デバイスに関係する多くの機能が含まれます。

私の質問は、各ライトをマルチスレッドにすることは可能でしょうか? それとも、グラフィックス デバイスが 1 つしかなく、一度に 1 つのスレッドしか使用できないため、これは不可能でしょうか? 可能であれば、パフォーマンスは向上しますか?

4

1 に答える 1

1

基本的にいいえ。XNAのGraphicsDeviceは、レンダリング用にシングル スレッドです。リソース (テクスチャ、頂点バッファーなど) を複数のスレッドから GPU に送信できます。Drawただし、 (および のような他のレンダリング関数Present) はメイン スレッドからのみ呼び出すことができます。

適切なロックを設定して、複数のスレッドからレンダリング タイプのものを実行することに成功した人々について聞いたことがあります。しかし、それは「悪いブードゥー教」のようです。リンクされた投稿にあるように、「XNA フレームワークのドキュメントはここで約束をしていません」。言うまでもなく、ロックを正しく行うことさえ難しいです。

複数のグラフィックス デバイスを作成することについてはよくわかりません。自分で試したことはありません。可能だと思いますが、デバイス間でリソースを共有できないため、かなり役に立ちません。おそらく、努力する価値はありません。

あなたの質問に対するコメントでjalfが述べたように、GPUに到達すると、すべてがすでに並行して処理されます。したがって、これは、バッチ制限に達したために CPU が制限されている場合にのみ役立ちます(バッチ以外のほとんどすべてを別のスレッドに移動できるため)。その場合、このようなクレイジーなスキームを試す前に、最初にバッチ数を減らすために考慮すべき多くの最適化があります。(そして、あなたは自分のパフォーマンスを測定しましたよね?

あなたがしようとしているのは、かなり複雑なシーンをバックグラウンドのレンダー ターゲットにレンダリングし、多くのフレームに負荷を分散させることのようです。その場合、パフォーマンス要件がそれを決定する場合、メインスレッドで複数のフレームにわたってレンダリングし、手動でスケジュールすることができます。RenderTargetUsage.PreserveContentsグラフィックス デバイスに配置するたびにクリアされないように設定することを忘れないでください。

于 2012-08-14T08:54:17.207 に答える