MicrosoftがBrushリソースを、Direct2Dコンテキスト全体ではなく、個々のDirect2Dレンダリングターゲットにバインドすることを決定したのはなぜですか。ユーザーがフルスクリーンモードとウィンドウモードを切り替えたとき、またはサイズ変更したときに、画面の全幅と高さにサイズ変更する必要があるDirect2Dレンダリングターゲット(HUDの場合)にマップされたDirect3Dテクスチャがある場合はどうすればよいですか?窓?これが発生したときにすべてのブラシを再作成するのは、これだけです。または、Direct2Dサーフェスではなく、ブラシをID2D1Factoryにバインドするなど、別の方法はありますか?
2 に答える
ブラシでは、GPUにリソースを割り当てる必要があります。Direct2Dは「ポリシーレス」APIであるため、メモリ使用量を直接制御できるようにする必要があるため、ブラシファクトリメソッドはルートファクトリではなくレンダーターゲットからハングします。そうしないと、ハードウェアリソースを解放するタイミングを決定するポリシーを設定する必要があり、そのポリシーは一部のシナリオでは常に間違っています(パフォーマンスやメモリ使用量に悪影響を及ぼします)。
ジオメトリとストロークスタイルのファクトリメソッドは、メインメモリに格納されているため、ルートファクトリにぶら下がっています。また、それらが影響する処理はすべてCPUで実行されます。を介して、ストロークスタイルのジオメトリオブジェクトをハードウェアリソースに「コンパイル」できます。ID2D1Mesh
これは、基本的に、頂点バッファに直接テッセレーションするだけです。はるかに高速になりますが(テッセレーション時ではなくレンダリング時!)、ジオメトリの複雑さに応じて、より多くのメモリを使用することもできます。
ユーザーがフルスクリーンモードとウィンドウモードを切り替えたときに何が起こるかを説明していなかったため、これが役立つかどうかはわかりません。したがって、唯一の変更はレンダリングターゲットのサイズであると思います。ReSize関数を呼び出すことでレンダリングターゲットのサイズを変更し、通常どおりブラシを使用できます。ブラシで変更する必要はありません。