為了獲得最佳效能,請使用 DXGI 翻轉模型
本主題提供開發人員指引,說明如何在新式 Windows 版本的簡報堆疊中將效能和效率最大化。 它會挑選DXGI 翻轉模型、DirectX 12:Windows 10 (視訊中的簡報模式) ,以及Windows 10中的簡報增強功能:早期外觀 (視訊) 離職。
喚起行動
如果您仍在使用 DXGI_SWAP_EFFECT_DISCARD 或 DXGI_SWAP_EFFECT_SEQUENTIAL () ,是時候停止了!
切換至 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 或 DXGI_SWAP_EFFECT_FLIP_DISCARD ( ,翻轉模型) 可提供更佳的效能、較低的耗電量,並提供更豐富的功能集。 (如需這些值的詳細資訊 ,請參閱DXGI_SWAP_EFFECT列舉 。)
相較于傳統「全螢幕獨佔」模式,翻轉模型就如同讓視窗模式有效地對等或更好。 事實上,您可能想要重新考慮您的應用程式是否真的需要全螢幕獨佔模式,因為翻轉模型無框線視窗的優點包括更快速的切換Alt-Tab切換,以及與新式顯示功能更好的整合。
為什麼是現在? 在 2018 年 4 月更新之前,blt 模型在混合式 GPU 設定上使用時可能會導致可見的卸載,通常可在高階膝上型電腦中找到, (請參閱 KB 3158621) 。 在 2018 年 4 月更新中,此卸載已修正,但代價是一些額外的工時。 如果您要跨混合式 GPU 以高畫面播放速率呈現 blt,特別是在 4K 等高解析度時,此額外工作可能會影響整體效能。 若要在這些系統上維持最佳效能,請從 blt 切換至翻轉呈現模型。 此外,請考慮減少交換鏈的解析度,特別是當它不是使用者互動的主要點 (,就像 VR 預覽視窗) 的情況一樣。
簡短歷程記錄
什麼是翻轉模型? 替代方式為何?
在 Windows 7 之前,從 D3D 呈現內容的唯一方式是「blt」或將其複製到視窗或螢幕所擁有的介面。 從 D3D9 的 FLIPEX 交換效果開始,並透過Windows 8中的FLIP_SEQUENTIAL交換效果進入 DXGI,我們開發了更有效率的方式,將內容直接與桌面撰寫器共用,以將內容放在螢幕上,以及最少的複本。 如需技術的高階概觀,請參閱 DXGI 翻轉模型 。
此優化可能是因為 DWM (Desktop Window Manager) ,這是驅動 Windows 桌面的撰寫器。
何時應該使用 blt 模型?
翻轉模型沒有提供一項功能:能夠產生多個不同的 API,這些 API 會以目前為基礎,將所有層一起分層到相同的 HWND。 其中一個範例是使用 D3D 繪製視窗背景,然後 Windows GDI 在頂端繪製某個專案,或使用來自相同 API 的兩個不同的圖形 API 或兩個交換鏈來產生交替畫面。 如果您不需要圖形元件之間的 HWND層級 Interop,則不需要 blt 模型。
原始翻轉模型設計中未提供第二個功能,但現已提供,這是以未中斷的畫面播放速率呈現的功能。 對於使用同步間隔 0 的應用程式,除非有 IDXGIFactory5::CheckFeatureSupport API 可用,且報表支援 DXGI_FEATURE_PRESENT_ALLOW_TEARING,否則不建議切換為翻轉模型。 這項功能幾乎可在最新版的 Windows 10和現代化硬體上無所不在。
DirectFlip
如果您已觀看DirectX 12:Windows 10中的簡報模式,您會看到關於「直接翻轉」和「獨立翻轉」的交談。這些是針對使用翻轉模型交換鏈的應用程式啟用的優化。 視視窗和緩衝區組態而定,可以完全略過桌面組合,並直接將應用程式畫面傳送到畫面,就像獨佔全螢幕一樣。
這些天,這些優化可以參與 3 個案例的其中一個,以增加功能的順序:
- DirectFlip:您的交換鏈緩衝區符合螢幕尺寸,而您的視窗用戶端區域則涵蓋螢幕。 不使用 DWM 交換鏈在畫面上顯示,而是使用應用程式交換鏈。
- DirectFlip 與面板配接器:您的視窗用戶端區域涵蓋螢幕,而您的交換鏈緩衝區位於一些硬體相依縮放 (比例內,例如,螢幕的 0.25x 到 4x) 。 GPU 掃描硬體可用來調整緩衝區,同時將它傳送至顯示器。
- 具有多平面重迭的 DirectFlip (MPO) :您的交換鏈緩衝區位於視窗維度的某些硬體相依縮放比例內。 DWM 能夠為您的應用程式保留專用的硬體掃描平面,然後掃描出來,並可能延展到螢幕的 Alpha 混合子領域。
透過視窗翻轉模型,應用程式可以查詢不同 DirectFlip 案例的硬體支援,並透過使用 IDXGIOutput6::CheckHardwareCompositionSupport來實作不同類型的動態調整。 要注意的一個注意事項是,如果利用面板配接器,游標可能會遭受延展副作用,這可透過 DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_CURSOR_STRETCHED來表示。
一旦您的交換鏈已「DirectFlipped」,DWM 就可以進入睡眠狀態,並只在應用程式以外的某個專案變更時喚醒。 您的應用程式畫面會直接傳送到螢幕,且效率與全螢幕獨佔相同。 這是「獨立翻轉」,而且可以參與上述所有案例。 如果其他桌面內容上線,DWM 可以順暢地轉換回撰寫模式、有效率地「反向撰寫」應用程式上方的內容再翻轉,或利用 MPO 來維護獨立的翻轉模式。
請參閱 PresentMon 工具,以深入瞭解使用上述哪一項。
翻轉模型中還有什麼新功能?
除了上述改進功能,這些功能適用于標準交換鏈,不需要任何特殊專案,還有數個功能可供翻轉模型應用程式使用:
- 使用 DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT減少延遲。 在獨立翻轉模式中,您可以在最新版的 Windows 上減少到 1 個延遲畫面,並在撰寫時適當地回復到可能的最低延遲。
- 注意:在Windows 10年度更新版和更早版本中,至少有兩個畫面格延遲的問題。 如需詳細資訊 ,請參閱此論壇主題 。 這是在 Fall Creator's Update 中修正的。
- DXGI_SWAP_EFFECT_FLIP_DISCARD 啟用直接翻轉的「反向組合」模式,這會導致顯示桌面的整體工作較少。 DWM 可以在應用程式緩衝區上進行擷取,並將這些緩衝區傳送到畫面,而不是將完整複本執行到自己的交換鏈。
- DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING 可以啟用比可等候物件還低的延遲,即使是在支援多平面重迭的系統上的視窗中。
- 應用程式可以使用在交換鏈建立期間設定 的 DXGI_SCALING 屬性,來控制視窗重設期間發生的內容調整。
- 除非將內容組成 SDR 桌面,否則 HDR 格式 (R10G10B10A2_UNORM或R16G16B16A16_FLOAT) 的內容不會受到限制。
- 目前統計資料可在視窗模式中使用。
- UWP (通用 Windows 平臺) 應用程式模型和 DX12 有更大的相容性,因為這些只與翻轉模型相容。
我該怎麼做才能使用翻轉模型?
翻轉模型交換鏈在 blt 交換鏈之上有一些額外的需求:
- 緩衝區計數必須至少為 2。
- 在 Present呼叫之後,後端緩衝區必須明確地重新系結至 D3D11 立即內容,才能再次使用。
- 呼叫SetFullscreenState之後,應用程式必須在Present之前呼叫ResizeBuffers。
- 翻轉模型中不支援 MSAA (多重取樣反鋸齒) 交換鏈,因此應用程式必須在發出 簡報之前先執行 MSAA 解析。
如何選擇正確的轉譯和簡報解析度
過去應用程式的傳統模式是為使用者提供選擇獨佔全螢幕模式時所要選擇的解析度清單。 透過新式顯示器能夠順暢地開始調整內容,請考慮讓使用者能夠選擇效能調整的轉譯解析度,與輸出解析度無關,甚至是在視窗模式中。 此外,應用程式應該利用 IDXGIOutput6::CheckHardwareCompositionSupport 來判斷它們是否需要在呈現內容之前調整內容,或是否應該讓硬體進行調整。
您的內容可能需要從一個 GPU 移轉至另一個 GPU,作為目前或組合作業的一部分。 這通常適用于多 GPU 膝上型電腦,或插入外部 GPU 的系統。 隨著這些組態變得更常見,而且當高解析度顯示器變得更常見時,呈現完整解析度交換鏈的成本會增加。 如果您的交換鏈目標不是使用者互動的主要點,就如同將 VR 場景 2D 預覽呈現到次要視窗的 VR 標題的情況一樣,請考慮使用較低的解析度交換鏈,將需要跨不同 GPU 傳輸的頻寬量降到最低。
其他考量
當您第一次要求 GPU 寫入交換鏈回緩衝區時,GPU 將會停止等候緩衝區可供使用的時間。 可能的話,請盡可能將這個點延遲到框架中。