フルスクリーンモードでDirect3Dアプリケーションのパフォーマンスが向上する理由
-
08-07-2019 - |
質問
Direct3Dアプリケーションのパフォーマンスは、ウィンドウモードと比較して、フルスクリーンモードで大幅に向上するようです。この背後にある技術的な理由は何ですか?
これは、フルスクリーンアプリケーションがディスプレイを排他的に制御できるという事実と関係があると思います。しかし、アプリケーションが画面(ウィンドウなど)の part を排他的に制御できず、同じパフォーマンスのメリットを得ることができないのはなぜですか?
解決
下に物事がどのように機能するかについての断り書きがあります。
モニター画面は、何でも表示できるように、いわゆるプライマリサーフェスと常に関連付けられている必要があります。つまり、ビデオカードは、ビデオメモリ内の1つのサーフェスのみをスキャンできます。
アプリケーションがフルスクリーンの場合(およびすべてが正しく設定されてフリップが有効になっている場合)、プライマリサーフェスはアプリケーションバックバッファの1つに過ぎず、フレームごとに別のバックバッファにフリップされます。これは画面に表示する最も効率的な方法ですが、アプリケーションにはモニター領域全体(つまり、プライマリサーフェス全体)を所有する必要があります。
フルスクリーンアプリケーションがなく、DWMがオフの場合、プライマリサーフェスはOSによって所有され、ウィンドウ化されたアプリケーションはすべて、アプリケーションバックバッファからプライマリサーフェスへのブリットを実行します。このブリットは、完了するのにいくらかのGPU時間(および画面に表示される他のアプリケーションからのブリット)を要するため、フルスクリーンプレゼンテーションほど効率的ではありません。 XPはそのように機能しました。
DWMが画面を構成しているとき、事態はさらに複雑になります。 ここでは、DWMがプライマリサーフェスを所有しており、そこにアプリケーションウィンドウを描画する必要があります。それを可能にするために、すべてのウィンドウには、リダイレクトサーフェスと呼ばれる、コンテンツを保持する関連付けられたサーフェスがあります(これにより、DWMはウィンドウゴースト、ガラス効果、その他すべての優れた機能を有効にできます)。 D3Dアプリケーションはフレームを発行するたびに、リダイレクトサーフェスにブリットを追加します。 そのように、いくつかのブリットが発生する必要があります:アプリによるリダイレクトサーフェスへのブリット、DWMによるリダイレクトサーフェスからプライマリへのブリット、これもフルスクリーンに比べてオーバーヘッドです。
追加の作業はすべてGPUで行われるため、CPUパフォーマンスには影響しません。
さらに読みたいもの:
http://blogs.msdn.com/greg_schechter/ archive / 2006/03/19 / 555087.aspx
http://blogs.msdn.com/greg_schechter/ archive / 2006/05/02 / 588934.aspx
http://blogs.msdn.com/greg_schechter/ archive / 2006/03/05 / 544314.aspx
他のヒント
MSDNにはちょっとがありますそれは、ブリッティングとは対照的に、正しく設定されている場合、フルスクリーンモードではバッファ反転を使用することを意味します。理にかなっています。
もちろん、画面の一部をアプリケーションに排他的に制御することができます(しかし、ある意味では行います)が、画面の残りの部分はどうなりますか?残りのウィンドウでブリット、オクルージョンチェックなどを行う必要があり、それがパフォーマンスヒットの原因であると思います。
たとえば、あるウィンドウでWindows Media Playerでビデオを再生し、別のウィンドウでCivilizationを起動した場合、Civが派手なグラフィックスを実行し始めると、画面スペースを他のすべてのもの(ビデオなど)と共有する必要があります
一方、DirectXアプリにフルスクリーンがある場合、他のすべては「更新中」になる可能性があります。または" playing"であるが、描画されていない 。
基本的に、ビデオハードウェアは排他モードアプリケーション専用です。
ビデオリソース(パイプライン、テクスチャメモリなど)の競合はありません
特に、テクスチャのアップロードは大きなボトルネックになる可能性があります。必要なことは(それがすべてあるので)少ないほど良いです。