| デスクトップウィンドウマネージャー | |
|---|---|
| 開発者 | マイクロソフト |
| 初回リリース | 2006年11月30日 (2006-11-30) |
| オペレーティング·システム | マイクロソフトウィンドウズ |
| サービス名 | UxSms [注 1 ] |
デスクトップ ウィンドウ マネージャー( DWM、以前はデスクトップ コンポジット エンジンまたは、リセット前のWindows LonghornのビルドではDCE ) は、Windows Vista以降のMicrosoft Windowsの合成ウィンドウ マネージャーであり、ハードウェア アクセラレーションを使用してWindows のグラフィカル ユーザー インターフェイスをレンダリングできるようにします。
これは元々、新しい「Windows Aero」ユーザーエクスペリエンスの一部を実現するために開発され、透過表示や3Dウィンドウの切り替えなどの効果を実現していました。Windows Server 2008にも含まれていますが、「デスクトップエクスペリエンス」機能と互換性のあるグラフィックドライバのインストールが必要です。[ 1 ]
デスクトップウィンドウマネージャーは合成型ウィンドウマネージャーです。つまり、各プログラムはデータを書き込むバッファを持ち、DWMは各プログラムのバッファを合成して最終的な画像を生成します。これに対し、 Windows XP以前(およびWindows Aeroを無効にしたWindows VistaとWindows 7)のスタッキング型ウィンドウマネージャーは、すべてのプログラムが書き込む単一のディスプレイバッファで構成されます。
DWMの動作は、オペレーティングシステム(Windows 7またはWindows Vista)と、使用するグラフィックドライバのバージョン(WDDM 1.0または1.1)によって異なります。Windows 7でWDDM 1.1ドライバを使用する場合、DWMは、たとえそれがグラフィックデバイスインターフェイス(GDI)プログラムであっても、プログラムのバッファをビデオRAMに書き込むだけです。これは、Windows 7がGDIの(限定的な)ハードウェアアクセラレーションをサポートしているためです[ 2 ] 。そのため、CPUが書き込むためにバッファのコピーをシステムRAMに保持する必要がないためです。
コンポジターはすべてのアプリケーションのグラフィックスにアクセスできるため、透明など、複数のアプリケーションのビジュアルを連結する視覚効果を簡単に実現できます。 DWM は、DirectXを使用して GPU で合成とレンダリングの機能を実行し、オフスクリーン バッファーからディスプレイへのレンダリングを管理するタスクから CPU を解放します。ただし、オフスクリーン バッファーにペイントするアプリケーションには影響しません。そのために使用されているテクノロジによっては、これが CPU バウンドになる可能性があります。GDIなどの DWM に依存しないレンダリング手法は、ユーザー インターフェイス(UI) をビットマップとしてレンダリングすることにより、バッファーにリダイレクトされます。 WPFなどの DWM 対応レンダリング テクノロジは、内部データ構造を DWM 互換形式で直接使用できるようにします。バッファー内のウィンドウの内容は、DirectX テクスチャに変換されます。
デスクトップ自体はフルスクリーンのDirect3Dサーフェスであり、ウィンドウは 2 つの隣接する (かつ互いに反転した) 三角形で構成されるメッシュとして表現され、2D の長方形を表すように変換されます。UI クロムを表すテクスチャは、これらの長方形にマッピングされます。ウィンドウの遷移は、シェーダープログラムを使用して、メッシュの変換として実装されます。[ 3 ] Windows Vista では、遷移は、変換を実装する組み込みシェーダーのセットに制限されています。マイクロソフトの開発者である Greg Schechter は、将来のリリースで開発者とユーザーが独自の効果をプラグインできるようにこれを開放する可能性を示唆しています。[ 4 ] DWM は、主要なデスクトップ オブジェクトのみを 3D サーフェスとしてマッピングします。仮想デスクトップや、ユーザー アカウント制御によって使用されるセキュリティで保護されたデスクトップなど、他のデスクトップ オブジェクトはマッピングされません。[ 5 ]


すべてのアプリケーションはオフスクリーン バッファーにレンダリングするため、他のアプリケーションに埋め込まれたバッファーからそれらを読み取ることもできます。オフスクリーン バッファーはアプリケーションによって常に更新されるため、埋め込まれたレンダリングはアプリケーション ウィンドウの動的表現であり、静的レンダリングではありません。これが、Windows VistaおよびWindows 7でのライブ サムネイル プレビューとWindows フリップの動作方法です。 DWM は、アプリケーションがこれらのサムネイル表現にアクセスできるパブリック API を公開しています。[ 6 ]サムネイルのサイズは固定ではありません。アプリケーションは、元のウィンドウよりも小さいサイズ、同じサイズ、またはそれよりも大きいサイズでサムネイルを要求でき、DWM は返す前にサムネイルを適切に拡大縮小します。 Aero Flip では、Direct3D テクスチャに直接アクセスできないため、パブリック サムネイル API は使用しません。[ 7 ]代わりに、Aero Flip は DWM エンジンに直接実装されています。
デスクトップウィンドウマネージャーは、 Windows Presentation Foundationと共有するアンマネージドコンポジターであるメディア統合層(MIL)を使用して、ウィンドウをコンポジションツリー内のコンポジションノードとして表現します。コンポジションツリーはデスクトップと、そこにホストされているすべてのウィンドウを表し、MILによってシーンの奥から手前へとレンダリングされます。[ 8 ]すべてのウィンドウが最終画像に寄与するため、結果として得られるピクセルの色は複数のウィンドウによって決定されます。これは、ピクセル単位の透明化などの効果を実装するために使用されます。DWMでは、カスタムシェーダーを呼び出して、複数のアプリケーションのピクセルを使用して表示されるピクセルを作成する方法を制御できます。DWMには、ウィンドウ内のピクセルの色を、その背後にあるウィンドウとその周囲のピクセルによって決定されたピクセルの色を平均化することで計算するピクセルシェーダー2.0プログラムが組み込まれています。これらのシェーダーは、DWMによって管理されるウィンドウのウィンドウ境界にぼかし効果を与えるために使用され、オプションでアプリケーションから要求された領域にもぼかし効果を与えます。[ 3 ]
MILはコンポジションツリーをキャッシュすることでリテインモードグラフィックシステムを提供するため、ウィンドウが移動されたときに画面を再描画してリフレッシュする作業はDWMとMILによって処理され、アプリケーションの責任が軽減されます。背景データは既にコンポジションツリーとオフスクリーンバッファ内に存在し、背景のレンダリングに直接使用されます。Vistaより前のWindows OSでは、バックグラウンドアプリケーションにメッセージを送信して再レンダリングを要求する必要がありましたWM_PAINT。[ 6 ] DWMはダブルバッファグラフィックを使用して、ウィンドウを移動するときにちらつきやティアリングを防ぎます。[ 3 ] [ 6 ]合成エンジンは、カリングなどの最適化を使用してパフォーマンスを向上させ、変更されていない領域は再描画しません。[ 8 ]コンポジターはマルチモニタに対応しているため、DWMはこれもネイティブでサポートしています。[ 8 ]
ゲームなどの全画面アプリケーションでは、DWM はウィンドウの合成を実行しないため、パフォーマンスが大幅に低下することはありません。
Windows 8 およびWindows Server 2012では、新しく実装された「スタート画面エクスペリエンス」により、DWM が常時使用され、無効にすることはできません。Windows 8 では、通常、DWM プロセスが常時実行されている必要があるため、プロセスに関する問題が発生しているユーザーは、システムの再起動後にメモリ使用量が減少するのを目にしています。これは、役立つ可能性のある多くのトラブルシューティング タスクの最初のステップになることがよくあります。Windows 8 では、DWM の再起動を一時的に防ぐことができます。これにより、デスクトップが黒くなり、タスクバーが灰色になり、スタート画面やモダン アプリが壊れますが、デスクトップ アプリは引き続き機能し、XP で使用されるシングル バッファー レンダラーに基づく Windows 7 および Vista のベーシック テーマと同じように表示されます。また、Windows プレインストール環境内で表示される、Windows 8 の中央揃えのタイトル バーも使用されます。 DWMなしでWindowsを起動すると、Windows 1507以降などのWindowsバージョンでWindows.UI.Logon.dllが存在しない場合にコマンドラインインターフェイスプログラムとして表示されるフォールバックロック画面とは異なり、デフォルトのロック画面でDWMが必要とされるため、DWMなしではWindowsを起動できません。そのため、DWMはオンザフライでしか実行できず、実用的な用途はありません。Windows 10以降では、タスクバーと新しいスタートメニューにユニバーサルアプリが実装されているため、このようにDWMを無効にすると、従来のデスクトップアプリであっても、合成エンジン全体が機能しなくなります。WindowsはDWMがなくても部分的には使用できますが、DWMに依存するSihost.exeが存在しない必要があります。Windows 11のほとんどのアプリケーションは、UI要素と透明度のレンダリングにDWMを必要とします。Windows 11の新しいタスクマネージャーは、フォールバック-dバージョンとは異なり、メニューのレンダリングにdwmを必要とします。以前のバージョンとは異なり、Windows 8はWindows Advanced Rasterization Platform (WARP)を介して基本的なディスプレイアダプターをサポートしています。WARPは、グラフィックスカードではなくソフトウェアレンダリングとCPUを使用してインターフェイスをレンダリングします。これにより、DWMは互換性のあるドライバーなしでも動作しますが、通常のグラフィックカードと同じレベルのパフォーマンスは得られません。Windows 8のDWMは、立体3Dのサポートも追加しています。[ 9 ]
DWMに対応していないレンダリング手法では、出力をDWMバッファにリダイレクトする必要があります。Windowsでは、レンダリングにGDIまたはDirectXのいずれかを使用できます。これら2つをDWMで動作させるために、両方のリダイレクト手法が用意されています。
Microsoft Windowsで最も多く使用されている UI レンダリング技術である GDI では、各アプリケーション ウィンドウまたはその一部が画面に表示されたときに通知され、アプリケーションがそのウィンドウ自体をレンダリングします。 DWM を使用しない場合、レンダリングではビデオ メモリ内のバッファーで UI がラスタライズされ、そこから画面にレンダリングされます。 DWM では、GDI 呼び出しはソフトウェア レンダラーである Canonical Display Driver (cdd.dll) を使用するようにリダイレクトされます。[ 10 ]ウィンドウのサイズに等しいバッファーがシステム メモリに割り当てられ、CDD.DLL はビデオ メモリではなくこのバッファーに出力します。別のバッファーはビデオ メモリに割り当てられ、DirectX サーフェスを表し、ウィンドウ メッシュのテクスチャとして使用されます。システム メモリ バッファーは個別に DirectX サーフェスに変換され、同期が保たれます。GDI は DirectX ピクセル形式で直接出力できないため、この回り道が必要になります。サーフェスはコンポジターによって読み取られ、ビデオ メモリ内のデスクトップに合成されます。 GDI出力のシステムメモリへの書き込みはハードウェアアクセラレーションされておらず、DirectXサーフェスへの変換も行われません。GDIウィンドウが最小化、非表示、または全画面DirectXアプリケーションと同じモニター上で表示されている場合は、GDIの制限により、描画または更新中にデバイスコンテキストを要求する際に、アプリケーションはGDIビットマップバッファを受け取れなくなります(これは、あるウィンドウから別のウィンドウにコピーするGDI操作で、期待されるウィンドウコンテンツではなく、黒または空の領域が出力される場合に発生することがあります)。そのため、DWMはアプリケーションが最小化される前にバッファにレンダリングされた最後のビットマップを使用します。[ 11 ]
Windows 7 以降では、WDDM 1.1/DXGI 1.1 準拠のビデオ ドライバーが存在する場合、Canonical ディスプレイ ドライバーはシステム メモリのコピーにレンダリングしなくなりました。
DirectXを使用して3D サーフェイスに書き込むアプリケーションの場合、 Windows Vistaの DirectX 実装ではWDDMを使用してサーフェイスを DWM と共有します。次に、DWM はサーフェイスを直接使用してウィンドウ メッシュにマップします。Windows Presentation Foundation (WPF) アプリケーション (DirectX アプリケーション) の場合、コンポジターはこのような共有サーフェイスにレンダリングし、最終的なデスクトップに合成されます。[ 11 ]アプリケーションは、同じウィンドウのレンダリングに GDI と DirectX の両方が使用されない限り、複数の子ウィンドウ間でいずれかのレンダリング手法を混在させることができます。その場合、DirectX レンダリングと GDI レンダリング間の順序は保証されず、したがって、システム メモリの GDI ビットマップがビデオ メモリ サーフェイスに変換されたことが保証されません。つまり、最終的な合成には GDI でレンダリングされた要素が含まれない可能性があります。[ 11 ]これを防ぐために、同じウィンドウで GDI と DirectX を混在させるアプリケーションが実行中である限り、DWM は一時的にオフになります。
Windows Vistaでは、DWMは互換性のある物理または仮想ハードウェアを必要とする: [ 12 ]
Windows 7では、デスクトップウィンドウマネージャーがDirect3D 10.1を使用するように再設計されましたが、ハードウェア要件はWindows Vistaと同じです。Direct3D 9ハードウェアは、Direct3D 11ランタイムで導入された「 10レベル9」レイヤーでサポートされています。Windows 8はWindows 7と同じ要件ですが、互換性のあるビデオハードウェアがない場合でもソフトウェアレンダリングを使用できます。[ 9 ]
DWMに必要なハードウェアをエミュレートするハードウェア仮想化ソフトウェアには、 VirtualBox 4.1以降、VMware Fusion 3.0以降、VMware Workstation 7.0以降などがあります。さらに、Windows Virtual PCでは、リモートデスクトッププロトコルを使用した構成が可能です。
デスクトップ ウィンドウ マネージャーに関連する開発者機能は、 Windows SDKdwmapi.h内のヘッダー ファイル内で提供されます。