DWMの動作

DWMの動作について、自分なりに調べて解説する。

★概要


基本知識

基本的な解説はWikipediaがわかりやすい。
Desktop Window Manager

図解としてはこれかな↓左側の「Blt Mode Present」
DXGI flip model
#ref error :画像を取得できませんでした。しばらく時間を置いてから再度お試しください。

簡単に解説すると、
①アプリケーションはオフスクリーンバッファ(直接表示されない映像データ)を持つ。
②DWMはフルスクリーンの3Dサーフェイスを持つ。これはディスプレイに表示される映像データ。
③DWMは垂直同期信号(60Hz)でタイミングをとりつつ各アプリケーションのオフスクリーンバッファを自身の3Dサーフェイスに重ね合わせる。

DWMの利点

  • アプリケーションの移動や重ね合わせによる再描画が不要。オフスクリーンバッファを再利用するだけ
  • アプリケーションの効果(透過、影)をGPUにより非常に低負荷で高速に描画できる
  • サムネイル表示の負荷が小さい。オフスクリーンバッファを再利用するだけ
  • ティアリングが発生しない

DWMの欠点

  • アプリケーション→①オフスクリーンバッファ→②DWMサーフェイス→ディスプレイで同期をとりつつ描画するので遅延が発生する
  • メモリを余計に消費する

★考察


フルスクリーンだと遅延が発生しないという説について

 この説には賛同する。
 なぜかというと、フルスクリーン時はアプリケーションがディスプレイのサーフェイスを直接さわるので、DWMサーフェイスと競合するから。
 DWMがほかのオフスクリーンバッファを重ね合わせする必要はないし。
 そう仮定すると下記の挙動的にじつまがあう。
  • フルスクリーンでゲーム中スクリーンショットをとることができない
 →スクリーンショットはDWM有効時はDWMのサムネイル機能でコピーしてるとすればつじつまが合う。
  • フルスクリーンでサブディスプレイからタスクバーのサムネイルを表示するとまっ黒になっている。
 →もしDWMを介してフルスクリーンが描画されているとすると、タスクバーのサムネイルは表示されるはず
  • 下記計測結果の違いは、最後のDWMサーフェイスの重ね合わせが不要だから。
Mode BufferCount 垂直同期 Flag MaxFrameLatency 遅延
フルスクリーン 1 0 NONE 3 -3.25
ウィンドウ 1 0 NONE 3 -2.5

影響が大きいのはフルスクリーンよりむしろ垂直同期ON/OFF

 フルスクリーンでも垂直同期ONだと遅延がある。
 これは、基本的にDirectXでは、オフスクリーンバッファに書いた後、垂直同期信号を待って表示用バッファとオフスクリーンバッファを切り替えるからだと思う。
 DWMより、重ね合わせの1手順がないのでちょっぴり早いだけ。DWMを切っても変わらないんじゃないかな?
 ゲームは垂直同期OFFがおすすめ。
 ただし、通常のアプリケーションで垂直同期を切ることはできない。
 NVIDIAの設定で垂直同期をOFFにしても効果がなかった。タダの推測だが、OSがアプリケーションの中で初期状態としてONにしてしまっているのかも?



このページにアクセスした人の数: -






最終更新:2014年06月21日 03:22