DWMの動作について、自分なりに調べて解説する。
★概要
基本知識
#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