ケニー・カーのブログからのコンテキスト:
Windows Vista では、デスクトップ ウィンドウ マネージャーと呼ばれるサービスが導入されました。名前は誤解を招くものであり、現在も誤解を招き続けています。Windows の合成エンジンまたはコンポジターと考えてください。この合成エンジンは、デスクトップ上でのアプリケーション ウィンドウのレンダリング方法を完全に変えました。各ウィンドウをディスプレイまたはディスプレイ アダプターに直接レンダリングするのではなく、すべてのウィンドウをオフスクリーン サーフェスまたはバッファーにレンダリングします。システムはトップレベル ウィンドウごとにこのようなサーフェスを 1 つ割り当て、すべての GDI、Direct3D、そしてもちろん Direct2D グラフィックスがこれらのサーフェスにレンダリングされます。これらのオフスクリーン サーフェスは、リダイレクト サーフェスと呼ばれます。これは、GDI 描画コマンドと Direct3D スワップ チェーン プレゼンテーション リクエストでさえ、リダイレクト サーフェスに (GPU 内で) リダイレクトまたはコピーされるためです。
ある時点で、特定のウィンドウとは関係なく、構成エンジンは、最新の変更のバッチが与えられたデスクトップを構成する時期であると判断します。これには、これらすべてのリダイレクト サーフェスをまとめて構成し、非クライアント領域 (ウィンドウ クロームと呼ばれることが多い) を追加し、おそらくいくつかの影やその他の効果を追加し、最終結果をディスプレイ アダプターに提示することが含まれます。
以前のSOの質問の背景(写真を参照) :
DirectX でサイズを縮小すると、右端または下端に win32 背景のアーティファクトが表示されます。WS_EX_NOREDIRECTIONBITMAP
これは、スタイルを適用することで修正できます。スワップチェーンがウィンドウよりも小さいか大きいかは問題ではないためWS_EX_NOREDIRECTIONBITMAP
、コンポジション エンジンがないと、リダイレクション サーフェスに小さすぎる長方形がコピーされるように見えます (ウィンドウ サイズがマウス位置/「長方形のドラッグ」よりも遅れるため)。
実際の質問
ただし、WS_EX_NOREDIRECTIONBITMAP
最上位のウィンドウでのみ機能し、DirectX を子ウィンドウとして WPF に埋め込もうとしていますが、子ウィンドウの背景からのアーティファクトがまだ通過しています。これは、いくつかの関連する質問に私を導きます:
- (オプション) スワップチェーンがウィンドウ サイズよりも小さい場合、ウィンドウの残りの部分は黒で塗りつぶされます (写真を参照)。これは、スワップチェーンからリダイレクション サーフェスへのコピーの結果であり、宛先ストライドの残り (ソース幅の後) がゼロになりますか?
- (オプション) win32 バックグラウンドからのアーティファクトはどのように表示されますか? スワップチェーンからコピーする前に、リダイレクト サーフェスはこの色で塗りつぶされていますか?
- (オプション) ウィンドウのサイズが変更されるたびにリダイレクト サーフェスのサイズが変更されますか?
- (必須) 各子ウィンドウには、最上位ウィンドウのリダイレクト サーフェスにコピーされるリダイレクト サーフェスがありますか。そうでない場合、子供の win32 バックグラウンド アーティファクトはどのように表示されますか?
- (必須) これは、WPF に組み込まれた win32 ウィンドウのフレーム レートが WPF の可変フレーム レートに制限されるということですか? (DirectX ウィンドウを WPF に埋め込む目的は、一定の 60fps フレーム レートを取得することでした)