Desktop Window Manager
Desktop Window Manager
Desktop Window Manager(DWM、かつてはDesktop Compositing Engine、DCEとも)は、Windows Vista以降のMicrosoft Windows系オペレーティングシステムで用いられるデスクトップ描画システムである。Windows VistaおよびWindows 7ではWindows Aeroテーマ使用時などに限られていたが、Windows 8からはクラシックテーマが廃止され、常にDWMを使用するようになった。
Windows VistaおよびWindows 7では、WindowsテーマとしてのWindows AeroまたはWindows Vistaスタンダード・Windows 7スタンダードの選択時に用いられる。Windows 8以降ではすべての場合においてDWMが使用される。
Windows VistaおよびWindows 7において、DWMの実行には少なくともDirect3D 9.0Exとシェーダーモデル 2.0に対応したグラフィックスハードウェア (GPU)、そしてWindows Display Driver Model (WDDM) 対応のデバイスドライバーが必要である。Windows 8以降では、WDDM準拠のグラフィックスドライバーが存在しない場合、ソフトウェア (Microsoft Basic Display Adapter) でDWMの処理が行われる。
DWMはWindows Vista Starter エディションには搭載されていない。Windows Vista Home Basic エディションには DWM が搭載されているが、透明なガラス効果やフリップ3Dなど一部の機能は無効にされている。また、Windows Server 2008およびServer 2008 R2でも、対応GPUを用いて、「デスクトップ エクスペリエンス」機能を有効にすることでDWMが使用可能となる。
Windows VistaつまりWDDM 1.0世代のDWMの下では、アプリケーションソフトウェア(以下アプリケーション)の描画出力は直接ビデオメモリ(VRAM)に送られず、システム メモリのオフスクリーン バッファに保持される。そして、各アプリケーションのウィンドウの内容をDWMが最終的に合成して出力する。なお、macOSのQuartz Compositorも同様の仕組みを用いている。DWMがすべてのアプリケーションの描画内容を保持するため、透明効果のような複数のアプリケーション ウィンドウに跨る効果が容易に適用できる。DWMではDirect3D 9.0Exを通してGPUを利用し、オフスクリーン バッファから画面への描画に用いる過程にCPUを用いない仕組みとなっている。ただし、アプリケーションがオフスクリーン バッファへ描画する段階では、Graphics Device Interface(GDI)のようなDWMと密な連携を持たない描画技術を用いる場合、オフスクリーン バッファへCPUを用いてビットマップとして描画することになる。Windows Presentation Foundation(WPF)のようなDWM対応の描画技術では、DWM互換の形式の内部データを直接生成する。いずれにせよ、ウィンドウの内容はDirect3Dのテクスチャへ変換される。
Windows 7つまりWDDM 1.1ではDWMのメモリ管理機構が改良され、各アプリケーションのウィンドウ描画結果のコピーをシステムメモリに保持しなくなり、ワーキングメモリの消費を低減させた。また、Windows 7のデスクトップ描画にはDirect3D 10.1 APIが使用されている。
デスクトップは全画面のDirect3Dサーフェイスとなっている。2Dの長方形を表現する2つの三角形のメッシュからなっており、デスクトップの画面全体を表すテクスチャがそこへマップされる。ウィンドウの変化は、シェーダープログラムでメッシュの変化として実現されている。Windows Vistaでは、この変化はDWM内蔵のものしか利用できない。マイクロソフトの開発者であるGreg Schechterは、将来的にプラグイン方式で独自の効果を適用できるようにするかもしれないと示唆している。DWMはプライマリのデスクトップ オブジェクトのみを3Dサーフェイスとして扱う。ユーザーアカウント制御(UAC)のセキュア デスクトップを含む他のデスクトップ オブジェクトでは使用できない。
すべてのアプリケーションの描画がオフスクリーン バッファへ行われるようになった結果、他のアプリケーションが描画した内容を取り込めるようになった。オフスクリーン バッファはアプリケーションが絶えず更新するため、取り込んだ描画内容も動的に変化し続ける。これによって、ライブ サムネイル プレビューやWindowsフリップ3Dが実現されている。DWMはサムネイルを取得するAPIを公開している。サムネイルの大きさは固定されておらず、好きな大きさに拡大・縮小した画像を取得できる。Windowsフリップ3DはサムネイルAPIを用いてウィンドウの内容をビットマップ画像として取得し、2D長方形のテクスチャに変換し、カスタム シェーダーによって3Dメッシュへ変換して、3D上で回転のする動作を実現している。
DWMは(MIL)を用いている。これは、WPFと共同で使用するネイティブ コードで、各ウィンドウを合成ツリーの中の合成ノードとして扱い、最終的なデスクトップ画面を描画するシステムである。最終的な出力を行う際、複数のウィンドウから出力するピクセルの色を決定する場合もある。つまり、ピクセル毎の透明効果が実装されている。DWMはそれを実現するためにカスタム シェーダーを使用している。これらのシェーダーは、ウィンドウ枠のぼかし効果などにDWMが使っているほか、アプリケーション内部の描画でも任意で使用可能である。
MILは合成ツリーのキャッシュという形態による保持モード(Retained Mode)のグラフィック機構である。ウィンドウの移動に伴う再描画・リフレッシュはアプリケーションの関与無しにDWMとMILが制御している。その際、ウィンドウの内容はオフスクリーン バッファのものを用いるため、以前のようにWM_PAINTを投げてアプリケーションに再描画を求めなくなっている。これにより、DWMはダブル バッファによってウィンドウ移動時のちらつきを排除し、変化のない領域は再描画しないなどの最適化も行われている。合成処理が複数モニターの環境に対応しているため、DWMも複数モニターに対応している。
DWM非対応の描画技術では、出力をDWMのオフスクリーン バッファへ転送しなければならない。Windowsでは、GDIもしくはDirect3Dが描画に用いられるが、共にDWMへ転送する機構が用意されている。
WindowsでUIの描画に最もよく用いられているGDIは、各アプリケーションはウィンドウが表示される状態になったときに通知を受け、自身で描画するという形態をとっている。DWMのない状態では、VRAM上のバッファへ描画することになる。DWMの下では、ウィンドウと同じ大きさのバッファがシステム メモリ上に確保され、GDIでの描画はそこへ行われるようになる。さらに、VRAM上にDirect3Dサーフェイスが確保され、システム メモリのバッファの内容がそこへDirect3D形式へ変換しながら転送されるようになっている。システム メモリのバッファとVRAM上の内容は常に同期されるようになっている。システム メモリへのGDI描画には一切のハードウェア アクセラレーションが行われない。GDIの制限により、ウィンドウが最小化している間、バッファの内容は更新できない。その間、DWMは最小化直前のバッファの内容を保持し続ける。
3Dサーフェイスへ書き込むDirectXアプリケーションの場合、Windows VistaのDirectXの実装がDWMとサーフェイスを共有するようWDDMを用いており、DWMはアプリケーションのサーフェイスを直接、展開する。WPFアプリケーションでも同様に共有のサーフェイスへ書き込む。GDIとDirect3Dのような複数の描画技術を1つのウィンドウで用いることは不可能だが、1つのメイン ウィンドウ内に存在する複数の子ウィンドウ同士の間ではそれぞれ別のものを使用できる。その場合、GDIとDirect3Dの間で描画順序の保証はない。システム メモリのGDIビットマップが既にVRAM上のサーフェイスに変換されたかどうか保証できないためである。これを禁じたため、GDIとDirectXを1つのウィンドウで混合して用いるウィンドウを持つアプリケーションが実行中の場合、DWMは一時的に停止する。
DWMは次の要件を満たすハードウェア(外付けのグラフィックスカードやオンボードグラフィックスなどのGPU)を必要とする。
Windows Display Driver Model(WDDM)対応
DirectX 9対応(ピクセルシェーダー 2.0対応)
Windows Driver Kit(WDK)内のWindows Aero適応テストの通過