• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 3 月 19 日下午 2 點,鎖定 NVIDIA AI 網絡中文專場。立即注冊觀看
    內容創建/渲染

    使用 SetBackgroundProcessingMode 對 DirectX 12 進行游戲內 GPU 分析

    ?

    如果你是 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 性能。

    ?

    0

    標簽

    人人超碰97caoporen国产