「DWMの動作」の編集履歴(バックアップ)一覧はこちら
DWMの動作 - (2014/06/21 (土) 01:48:33) の最新版との変更点
追加された行は緑色になります。
削除された行は赤色になります。
DWMの動作について、自分なりに調べて解説する。
***概要
基本的な解説はWikipediaがわかりやすい。
[[Desktop Window Manager>http://ja.wikipedia.org/wiki/Desktop_Window_Manager]]
図解としてはこれかな↓左側の「Blt Mode Present」
[[DXGI flip model>http://msdn.microsoft.com/en-us/library/windows/desktop/hh706346(v=vs.85).aspx]]
#ref(http://i.msdn.microsoft.com/dynimg/IC554633.png)
簡単に解説すると、
①アプリケーションはオフスクリーンバッファ(直接表示されない映像データ)を持つ。
②DWMはフルスクリーンの3Dサーフェイスを持つ。これはディスプレイに表示される映像データ。
③DWMは垂直同期信号(60Hz)でタイミングをとりつつ各アプリケーションのオフスクリーンバッファを自身の3Dサーフェイスに重ね合わせる。
DWMの利点としては
-アプリケーションの移動をDWMがDirect3Dで管理してくれるのでGPUを利用し非常に低負荷
-アプリケーションの効果(透過、影)を非常に低負荷で高速に描画できる
-サムネイル表示の負荷が小さい。DWMが勝手にやってくれる
-ティアリングが発生しない
DWMの欠点としては
-アプリケーション→①オフスクリーンバッファ→②DWMサーフェイス→ディスプレイで同期をとりつつ描画するので遅延が発生する。
-メモリを余計に利用する
***考察
さて、
今回の遅延の変化を考察すると、
1.垂直同期を切る
上記の欠点で上げた「同期をとりつつ描画する」の部分で、
なぜ同期をとる必要があるかというと、
例えばオフスクリーンバッファを書き換えている途中にDWMがサーフェイスへのコピーが発生してしまうと、
描画途中の画面が表示されてしまうから。
2.フルスクリーンにする
まず、
|Mode|BufferCount|垂直同期|Flag|MaxFrameLatency|遅延|
|フルスクリーン|1|0|NONE|3|-3.25|
|ウィンドウ|1|0|NONE|3|-2.5|
これを考える。
DWMの動作について、自分なりに調べて解説する。
**★概要
***基本知識
基本的な解説はWikipediaがわかりやすい。
[[Desktop Window Manager>http://ja.wikipedia.org/wiki/Desktop_Window_Manager]]
図解としてはこれかな↓左側の「Blt Mode Present」
[[DXGI flip model>http://msdn.microsoft.com/en-us/library/windows/desktop/hh706346(v=vs.85).aspx]]
#ref(http://i.msdn.microsoft.com/dynimg/IC554633.png)
簡単に解説すると、
①アプリケーションはオフスクリーンバッファ(直接表示されない映像データ)を持つ。
②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にしてしまっているのかも?
このページにアクセスした人の数:&counter()
#javascript(){{
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-45987173-1', 'atwiki.jp');
ga('send', 'pageview');
}}