3

以前、ツールを作成するときは、D3Dバージョン9を使用しました。このバージョンでは、Present()の呼び出しでターゲットウィンドウと長方形を取得できるため、1つのデバイスから多くの異なるウィンドウに描画できます。これは、D3Dを使用してデスクトップアプリケーションを高速化したり、ゲームではなくツールを構築したりする場合に最適です。

また、以前にD3D11を使用してゲームレンダラーを構築しました。これは、状態管理とスレッドインターフェイスが適切に設計されており、(D3D 10とは対照的に)まだかなり一般的なD3D9レベルのハードウェアをターゲットにすることもできるためです。 、10以上のみをターゲットにできます)。

ただし、ここでD3D11を使用してツールを作成したいと思います。残念ながら、D3D11CreateDeviceAndSwapChain()から戻ってきたIDXGISwapChainは、そのHWNDを「記憶」しているようで、そのウィンドウにのみ表示したいと考えています。これは非常に不便です。ウィンドウが多数あり、それぞれにかなり単純なグラフィックを描画する必要があり、WM_PAINTに応答する場合のみです(これもゲームではなくツール用です)。

私がやりたいのは、バッファRAMを節約することです。具体的には、以前は、デスクトップのサイズである単一のバックバッファーを作成できました。これは、すべてのレンダリングニーズに対応できることがわかっていたため、割り当てられた単一のコピーになります。オーバーラップするウィンドウが10個ある場合でも、それらはすべて同じバックバッファーを介してレンダリングされるため、最初の割り当てを超えてメモリを浪費することはありません。スワップチェーンではないテクスチャを作成し、それらを「レンダリングターゲット」として使用することはできますが、ビットマップを読み戻してコピーすることなく、任意のクライアントウィンドウの任意の長方形に表示する良い方法を見つけることができません。 DIBSection、これは本当に非効率的です。また、多くのスワップチェーンを作成し、それらに同じバックバッファを共有させる方法はありません。

私ができる最善の方法は、ウィンドウごとに1つのスワップチェーンを作成し、各スワップチェーンのバックバッファーのサイズを実際に小さくすることです。ただし、スワップチェーンにレンダリングする場合は、ウィンドウに合わせてサイズを変更します。ただし、ターゲットのサイズ変更は「無料」の操作AFAICTではないため、これは非効率的なようです。それで、もっと良い方法はありますか?

4

1 に答える 1

1

私が最終的に得た答えは、個別の表示領域ごとに1つのバックバッファーを作成することであり、バックバッファーのサイズを変更することではありませんでした。デスクトップの構成と透明性が私の背後にある「何でも」喜んでくれる世界では、それはおそらくシステムに役立つと思います。VVMシステムを愛することを学ぶ、私は推測する:-)(仮想ビデオメモリ用のVVM)

于 2011-10-31T05:21:16.460 に答える