このトピックでは、最新バージョンの Windows でプレゼンテーション スタックのパフォーマンスと効率を最大限に高める方法に関する開発者向けガイダンスを提供します。 DXGI フリップ モデル 、DirectX 12: Windows 10 のプレゼンテーション モード (ビデオ)、および Windows 10 の プレゼンテーション拡張機能: 早期見た目 (ビデオ) 中断された場所を取り上げます。
行動喚起
DXGI_SWAP_EFFECT_DISCARD または DXGI_SWAP_EFFECT_SEQUENTIAL ("blt" 現在のモデル) をまだ使用している場合は、停止します。
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL または DXGI_SWAP_EFFECT_FLIP_DISCARD (フリップ モデル) に切り替えると、パフォーマンスが向上し、電力使用量が減少し、豊富な機能セットが提供されます。 (これらの値の詳細については、DXGI_SWAP_EFFECT 列挙 を参照してください)。
フリップモデルは、従来の「フルスクリーン排他」モードと比較して、ウィンドウモードを効果的に同等以上にします。 実際には、フリップ モデルのボーダレス ウィンドウの利点には、より高速な Alt-Tab 切り替えと最新のディスプレイ機能とのより優れた統合が含まれるため、アプリケーションが実際に全画面表示排他モードを必要としているかどうかを再検討することをお勧めします。
なぜ今? 2018 年 4 月の更新プログラムより前のバージョンでは、ハイブリッド GPU 構成で使用すると、blt モデルが表示され、ハイエンド ノート PC でよく見られる目に見える破損が発生する可能性があります (KB 3158621を参照)。 2018 年 4 月の更新プログラムでは、このティアリングは、追加作業のコストで修正されました。 ハイブリッド GPU 間で高いフレーム レート (特に 4K などの高解像度) で blt presents を実行している場合、この追加の作業が全体的なパフォーマンスに影響する可能性があります。 これらのシステムで最高のパフォーマンスを維持するには、blt からフリップ現在のモデルに切り替えます。 さらに、スワップチェーンの解像度を下げることを検討してください。特に、それがユーザー操作の主要なポイントではない場合 (多くの場合、VR プレビュー ウィンドウの場合と同様)。
簡単な歴史
フリップ モデルとは 代替手段は何ですか?
Windows 7 より前では、D3D からコンテンツを表示する唯一の方法は、ウィンドウまたは画面が所有していたサーフェスに "blt" またはコピーすることでした。 D3D9 の FLIPEX スワップ効果から始まり、Windows 8 の FLIP_SEQUENTIAL スワップ効果を使用して DXGI に来る場合、最小限のコピーでデスクトップ コンポジターと直接共有することで、コンテンツを画面に表示するより効率的な方法を開発しました。 技術 概要については、DXGI フリップ モデルの を参照してください。
この最適化は、Windows デスクトップを駆動するコンポジターである DWM (デスクトップ ウィンドウ マネージャー) のおかげで可能です。
blt モデルを使用する必要がある場合
フリップ モデルでは提供されない機能が 1 つあります。コンテンツを生成する複数の異なる API を持つ機能です。これは、すべてのレイヤーが同じ HWNDにまとめられます。 たとえば、D3D を使用してウィンドウの背景を描画し、Windows GDI を して何かを上に描画するか、2 つの異なるグラフィックス API または同じ API の 2 つのスワップチェーンを使用して、交互のフレームを生成します。 グラフィックス コンポーネント間 HWNDレベルの相互運用が必要ない場合は、blt モデルは必要ありません。
元のフリップ モデル 設計では提供されなかった機能の 2 つ目がありますが、現在は使用可能です。これは、非スロット化されたフレーム レートで表示する機能です。 同期間隔 0 を使用するアプリケーションの場合、IDXGIFactory5::CheckFeatureSupport API を使用でき、DXGI_FEATURE_PRESENT_ALLOW_TEARINGのサポートを報告しない限り、モデルを反転に切り替えることはお勧めしません。 この機能は、最新バージョンの Windows 10 と最新のハードウェアでほぼ普及しています。
DirectFlip
DirectX 12: Windows 10のプレゼンテーション モードを視聴した場合は、"Direct Flip" と "Independent Flip" に関する講演が表示されます。これらは、フリップ モデルスワップチェーンを使用するアプリケーションで有効になっている最適化です。 ウィンドウとバッファーの構成に応じて、排他的な全画面表示と同じ方法で、デスクトップ構成を完全にバイパスし、アプリケーション フレームを画面に直接送信することができます。
最近では、これらの最適化は、機能を向上させるために、次の 3 つのシナリオのいずれかに取り組むことができます。
- DirectFlip: スワップチェーン バッファーは画面のサイズと一致し、ウィンドウ クライアント領域は画面を覆います。 DWM スワップチェーンを使用して画面に表示する代わりに、アプリケーションスワップチェーンが使用されます。
- DirectFlip とパネル フィッターの: ウィンドウ クライアント領域が画面を覆い、スワップチェーン バッファーが画面のハードウェアに依存するスケール ファクター (0.25 倍から 4 倍など) 内にあります。 GPU スキャン アウト ハードウェアは、バッファーをディスプレイに送信するときにスケーリングするために使用されます。
- マルチプレーン オーバーレイ (MPO) を使用した DirectFlip の: スワップチェーン バッファーは、ウィンドウ ディメンションのハードウェアに依存するスケール ファクター内にあります。 DWM は、アプリケーション専用のハードウェア スキャンアウト プレーンを予約でき、スキャンアウトされ、画面のアルファ ブレンドサブ領域に拡張される可能性があります。
ウィンドウ フリップ モデルを使用すると、アプリケーションは、さまざまな DirectFlip シナリオのハードウェア サポートを照会し、IDXGIOutput6::CheckHardwareCompositionSupport 使用してさまざまな種類の動的スケーリングを実装できます。 注意すべき注意点の 1 つは、パネル フィッターが利用されている場合、カーソルがストレッチ副作用に苦しむ可能性があるということです。これは、DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_CURSOR_STRETCHEDを介して示されます。
スワップチェーンが "DirectFlipped" になると、DWM はスリープ状態になり、アプリケーションの外部で何かが変更されたときにだけ目を覚ますことができます。 アプリケーション フレームは、全画面表示専用と同じ効率で、画面に直接送信されます。 これは "独立したフリップ" であり、上記のすべてのシナリオに関与できます。 他のデスクトップ コンテンツが一番上にある場合、DWM はシームレスに構成済みモードに切り替えたり、コンテンツを反転する前にアプリケーションの上にコンテンツを効率的に "逆作成" したり、MPO を利用して独立したフリップ モードを維持したりできます。
PresentMon ツールを確認して、上記のうちどれが使用されたかを把握します。
フリップ モデルの他の新機能は何ですか?
上記の機能強化に加えて、特別な機能を使用せずに標準のスワップチェーンに適用される機能に加えて、フリップ モデル アプリケーションで使用できる機能がいくつかあります。
- DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECTを使用して待機時間を短縮します。 独立フリップ モードでは、最新バージョンの Windows で最大 1 フレームの待機時間を取得でき、構成時に可能な限り最小限にグレースフル フォールバックできます。
- DXGI_SWAP_EFFECT_FLIP_DISCARD は、ダイレクト フリップの "逆コンポジション" モードを有効にします。これにより、デスクトップを表示する全体的な作業が少なくなります。 DWM は、独自のスワップチェーンに完全コピーを実行する代わりに、アプリケーション バッファーに書き込んで画面に送信できます。
- DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING は、マルチプレーン オーバーレイがサポートされているシステム上のウィンドウ内であっても、待機可能なオブジェクトよりもさらに短い待機時間を実現できます。
- アプリケーションは、スワップチェーンの作成時に設定された DXGI_SCALING プロパティを使用して、ウィンドウのサイズ変更中に発生するコンテンツのスケーリングを制御できます。
- HDR 形式 (R10G10B10A2_UNORMまたはR16G16B16A16_FLOAT) のコンテンツは、SDR デスクトップに構成されていない限りクランプされません。
- 現在の統計情報は、ウィンドウ モードで使用できます。
- UWP (ユニバーサル Windows プラットフォーム) アプリケーション モデルと DX12 との互換性は、フリップ モデルとのみ互換性があるためです。
フリップ モデルを使用するには何を行う必要がありますか?
フリップ モデルのスワップチェーンには、blt スワップチェーンに加えていくつかの追加要件があります。
- バッファー数は少なくとも 2 である必要があります。
- Present 呼び出し 後、バック バッファーを D3D11 イミディエイト コンテキストに明示的に再バインドしてから、再度使用できるようにする必要があります。
- SetFullscreenState 呼び出した後、アプリケーションは Present をする前 ResizeBuffers を呼び出す必要があります。
- MSAA (マルチサンプル アンチエイリアシング) スワップチェーンはフリップ モデルでは直接サポートされていないため、アプリケーションは、Presentを発行する前に MSAA 解決を実行する必要があります。
適切なレンダリングとプレゼンテーションの解像度を選択する方法
以前のアプリケーションの従来のパターンでは、ユーザーが排他的全画面表示モードを選択したときに選択できる解像度の一覧をユーザーに提供してきました。 最新のディスプレイでコンテンツのスケーリングをシームレスに開始できる場合は、出力解像度から独立して、ウィンドウ モードであっても、パフォーマンスのスケーリングのためにレンダリング解像度を選択する機能をユーザーに提供することを検討してください。 さらに、アプリケーションでは、IDXGIOutput6::CheckHardwareCompositionSupport を利用して、コンテンツを提示する前にスケーリングする必要があるかどうか、またはハードウェアがスケーリングを実行できるようにする必要があるかどうかを判断する必要があります。
コンテンツは、現在またはコンポジション操作の一部として、ある GPU から別の GPU に移行する必要がある場合があります。 これは、多くの場合、マルチ GPU ノート PC、または外部 GPU が接続されているシステムに当てはまります。 これらの構成が一般的になり、高解像度ディスプレイがより一般的になるにつれて、完全な解像度のスワップチェーンを提示するコストが増加します。 スワップチェーンのターゲットがユーザー操作の主要なポイントではない場合(多くの場合、VR シーンの 2D プレビューをセカンダリ ウィンドウに表示する VR タイトルの場合)は、解像度の低いスワップチェーンを使用して、異なる GPU 間で転送する必要がある帯域幅の量を最小限にすることを検討してください。
その他の考慮事項
GPU にスワップチェーン バック バッファーへの書き込みを初めて求めるのは、バッファーが使用可能になるまで GPU がストールするのを待機する時間です。 可能な場合は、このポイントをフレームにできるだけ遅らせるようにします。