管道狀態對象( PSO )定義了在向 GPU 提交工作時硬件如何解釋和渲染輸入數據。 PSO 的正確管理對于系統資源的最佳使用和游戲的順利進行至關重要。
建議:
- 在工作線程上異步創建 PSO 。
- PSO 創建是著色器編譯和相關暫停發生的地方。
- 從具有通用著色器的通用 PSO 開始,這些著色器可以快速編譯并稍后生成專門化。
- 這可以讓您更快地啟動和運行,即使您還沒有運行最優化的 PSO 或著色器。
- PSO 之間共享的著色器將只編譯一次。
- 避免運行時 PSO 編譯,因為它們很可能會導致暫停。
- 驅動程序管理的著色器磁盤緩存可能會起到拯救作用。
- 使用 PSO 庫。
- 盡可能對“不在乎”字段使用相同的合理默認值。
- 這為粒子群優化算法的重用提供了更多可能性
- 使用
/all_resources_bound / D3DCOMPILE_ALL_RESOURCES_BOUND
編譯標志(如果可能的話)。- 編譯器可以在優化紋理訪問方面做得更好。
- 通過 PSO 和鑲嵌使用來安排繪制調用。
- 請記住, PSO 創建是編譯著色器和引入暫停的地方。
- 在使用 PSO 之前盡早異步創建 PSO 非常重要。
- 仔細處理 PSO 編譯線程的線程優先級。
- 使用空閑優先級如果不急于防止游戲線程的速度減慢。
- 考慮在“匆忙”時暫時提高優先級
不推薦:
- 在同一命令隊列上的計算和圖形之間切換是非常必要的。
- 這仍然是一個重大的轉變。
- 啟用/禁用過度切換鑲嵌。
- 這也是一個重量級的轉變。
- 在使用 PSO 之前盡早異步創建 PSO 非常重要。
- 仔細處理 PSO 編譯線程的線程優先級。
- 使用空閑優先級如果不急于防止游戲線程的速度減慢。
- 考慮在“匆忙”時暫時提高優先級
- 使用 FXC 在 DX12 中生成 DXBC 。
- 這導致額外的 DXBC 到 DXIL 的轉換,增加了編譯時間和 PSO 庫的大小。
- 一次將大量(數十萬) PSO 串行化到 PSO 庫中的磁盤。
- 這可能會大大增加系統內存的使用量。
- 改為使用“錯過并更新粒子群優化庫”策略。
本文介紹了在 NVIDIA GPU 上使用管道狀態對象時的最佳實踐。要在應用程序中獲得高性能且一致的幀速率,請參考高級 API 性能技巧。
鳴謝
感謝 Patrick Neil 和 Dhiraj Kumar 的建議和幫助。
?