DWMの動作

「DWMの動作」の編集履歴(バックアップ)一覧はこちら

DWMの動作」(2014/06/21 (土) 03:22:42) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

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にしてしまっているのかも?    
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'); }}    

表示オプション

横に並べて表示:
変化行の前後のみ表示: