如果你是 DirectX 12(DX12) 游戲開發人員,你可能已經注意到,即使應用程序端沒有任何變化,游戲 HUD 中實時顯示的 GPU 時間也可能會隨著時間的推移而變化。
GPU 時間變化的一個原因可能是 GPU Boost 動態地改變 GPU 核心時鐘頻率。即使使用 DX12 禁用了 GPU 升壓 SetStablePowerState API,GPU 游戲中測得的計時也可能在不同的跑步或每幀之間發生意外變化。需要考慮的因素包括是否進行了背景驅動程序優化,以及何時部署了優化后的著色器。
這篇文章提供了在使用 DX12 監控后臺驅動程序優化狀態的同時,在 NVIDIA GPU 上執行游戲內 GPU 評測的最佳實踐,使用 SetBackgroundProcessingMode API。
始終啟用后臺驅動程序優化
如果 DX12 驅動程序檢測到 CPU 開銷可能對 DX12 應用程序的幀速率產生負面影響的風險,它會自動禁用所有后臺優化。因此,例如,使用應用程序的 Debug 構建運行可能會導致優化程度較低的 GPU 工作負載。即使對于 Release 版本,驅動程序后臺優化也可以逐幀動態打開和關閉。
為了避免根據應用程序的 CPU 負載獲得不一致的分析結果,您可以請求驅動程序后臺優化始終處于啟用狀態,即使這可能會降低幀速率。使用以下調用(一次就足夠了,無需對每幀進行重做):
if (FAILED(pDevice6->SetBackgroundProcessingMode(
D3D12_BACKGROUND_PROCESSING_MODE_ALLOW_INTRUSIVE_MEASUREMENTS,
D3D12_MEASUREMENTS_ACTION_KEEP_ALL,
nullptr, nullptr)) {
// handle error.
}
等待后臺驅動程序優化線程
即使驅動程序后臺優化始終處于啟用狀態,優化通常也需要多個幀來收集觀察結果。然后,這些觀察結果將用于異步編譯著色器。相比之下, DX12 創建用于編譯的調用塊。這種新二進制文件的異步交付可能會導致一個著色器的 GPU 性能突然從一幀變到下一幀,而應用程序端沒有任何變化。
可以理解的是,這可能會導致著色器計時時出現大量混亂。您仍然應該以測量這些背景優化的著色器為目標,以避免驅動程序已經提供的應用程序優化工作。
要知道所有后臺驅動程序優化何時完成,以便在游戲內探查器中進行 GPU 性能測量,請在 Present 上使用以下代碼。繼續渲染幀,直到wantMoreFrames
返回為 false 。
出席:
BOOL wantMoreFrames;
if (FAILED(pDevice6->SetBackgroundProcessingMode(
D3D12_BACKGROUND_PROCESSING_MODE_ALLOW_INTRUSIVE_MEASUREMENTS,
D3D12_MEASUREMENTS_ACTION_KEEP_ALL,
nullptr,
&wantMoreFrames))) {
// handle error.
}
注意事項:
- 這個
wantMoreFrames
返回值結合了驅動程序的兩條信息:“后臺編譯當前是否正在運行”和“驅動程序是否希望向優化器演示更多的幀” - 我們建議您在游戲中 GPU 計時旁邊的游戲 HUD 中實時顯示此布爾值。
- 有可能
wantMoreFrames
如果驅動程序繼續生成新的二進制文件,則永遠不會變為 false 。我們建議您暫停游戲時間,不要移動相機以避免這種可能性。 - 如果
wantMoreFrames
在你的情況下,布爾值永遠不會變為假,即使在你暫停了所有模擬之后,你也可以回頭看看游戲 HUD 中的 GPU 時間是否已經確定。
將后臺處理模式重置為默認模式
使用以下調用返回 DX12 驅動程序的默認模式。在這種模式下,驅動程序根據內部啟發打開和關閉后臺優化。
if (FAILED(pDevice6->SetBackgroundProcessingMode(
D3D12_BACKGROUND_PROCESSING_MODE_ALLOWED,
D3D12_MEASUREMENTS_ACTION_KEEP_ALL,
nullptr, nullptr)) {
// handle error.
}
結論
要使用 DX12 游戲內 GPU 探查器在 NVIDIA GPU 上進行更具確定性的性能測量,我們建議您顯示wantMoreFrames
游戲中 HUD 中的布爾值位于游戲中 GPU 時間旁邊,以了解背景驅動程序優化是否正在進行中。
通過在開發期間以這種方式在游戲引擎中使用 DX12 SetBackgroundProcessingMode API ,游戲內 GPU 探查器將提供更可靠的信息。通過使用ALLOW_INTRUSIVE_MEASUREMENTS
背景處理模式下,您不應該再根據游戲的 CPU 負載獲得不同的 GPU 時間。通過等待wantMoreFrames
如果為 false ,則可以確保始終查看完全優化的著色器的 GPU 性能。
?