這篇文章介紹了 NVIDIA GPU s 上內存和資源的最佳實踐。要在應用程序中獲得高且一致的幀速率,請參閱所有高級 API 性能提示.
內存
DirectX 12 中的最佳內存管理對于高性能應用程序至關重要。為了在避免口吃的同時獲得最佳表現,應遵循以下建議。
推薦
- 視頻內存管理:
- 使用
IDXGIAdapter3:: QueryVideoMemoryInfo
可以獲得有關可用視頻內存的準確信息,因為前臺應用程序不一定分配全部甚至高百分比的視頻內存。 - 使用
IDXGIAdapter3::RegisterVideoMemoryBudgetChangeNotificationEvent
響應操作系統的預算更改。 - 使用
ID3D12Device1::SetResidencyPriority
向操作系統提供有關哪些堆應保留在內存中以及在視頻內存有限時應首先降級哪些堆的信息。- 最高優先級應給予 GPU – 書面資源,如渲染目標、深度緩沖區和無人機。
- 使用
MakeResident
和Evict
保持在預算范圍內- 根據需要刪除平鋪資源的
mip
級別。 - 在執行
vidmem
預算時,在執行命令列表之前或之后考慮使用MakeResident
或Evict
。 - 應用程序必須處理
MakeResident
失敗的情況。
- 根據需要刪除平鋪資源的
- 批處理
MakeResident
調用,但頁面表更新需要 CPU 和 GPU 成本。這降低了驅動器和 GPU 內部的開銷。
- 使用
- 資源創建:
- 資源創建應在關鍵路徑之外完成,并在需要分配之前完成
- 在應用程序運行時,將
CreateHeap
與CreatePlacedResource
和CreateReservedResource
一起使用,以最大限度地提高內存重用并減少內存分配調用的數量。 - 請注意,某些資源類型在堆中具有不同的對齊規則。
- 檢查資源堆層功能,并設計方法來處理設備功能級別內的各種資源綁定。
- 以 2 MB 的粒度將任何更新與放置或平鋪的資源對齊,以獲得最佳性能。
- 內存別名:
- 為了在對資源進行別名處理時獲得最佳性能,請將可在 GPU 硬件上壓縮的資源組合在一起,而不是與無法壓縮的資源組合在一起。反之亦然。
- 未壓縮資源:
- 大小小于 512 × 512 像素的任何資源
- 所有塊壓縮資源
- 不符合壓縮資源要求的所有其他紋理和無人機
- 壓縮資源:
- 所有深度緩沖區
- 渲染大于 512 × 512 像素的目標
- 紋理和無人機大于 512 × 512
- 本機支持算術壓縮的格式( 8-8-8-8 、 16-16 等)
- 64-KB 對齊緩沖區,開始時未壓縮。
- 未壓縮資源:
- 對于未壓縮的資源,首選在堆上使用提交的資源。這消除了在與壓縮資源對齊時跟蹤這些資源的 CPU 成本。
- 如果這是不可能的,那么所有未壓縮的紋理都應該有自己的堆,因為它們可以在它們之間進行別名
- 如果應用程序內存不足,則可以將堆拆分為未壓縮段和壓縮段,并將資源映射到適當的區域。
- 為了在對資源進行別名處理時獲得最佳性能,請將可在 GPU 硬件上壓縮的資源組合在一起,而不是與無法壓縮的資源組合在一起。反之亦然。
- 保留或平鋪資源:
- 將所有
UpdateTileMapping
調用移動到異步復制隊列以隱藏操作系統調度和提交成本。 - 只要重新映射相同的分片,就不需要顯式的
unmap
調用。 - 使用可在 GPU 硬件上壓縮的資源;紋理、渲染目標和無人機。
- 以 2-MB 的粒度將更新與磁貼資源對齊,以實現最佳壓縮。
- 將所有
不推薦
- 不要依賴平鋪資源的可用性。檢查蓋位。
- 您仍然需要考慮不同的 DX12 硬件類。
- 不要依賴于能夠一次性分配所有 GPU 內存。
- 不要指望打
Evict
電話會立即產生費用。成本 MIG 不能延遲,直到另一個MakeResident
調用使用內存。 - 不要使用創建和破壞資源的模式。
- 盡可能使用
MakeUnresident
和MakeResident
,因為這樣可以節省創建和銷毀資源的開銷
- 盡可能使用
- 當
pHeap
為 NULL 或設置D3D12_TILE_RANGE_FLAG_NULL
時,避免通過updateTileMapping
進行顯式取消映射調用。它強制驅動程序遍歷所有映射并移除不再映射的分幅。相反,請切換到其他磁貼。
資源
應根據應用程序的要求和性能仔細考慮資源格式和類型的選擇。這些建議不可能適用于所有應用程序,因為它們依賴于工作負載和限制。例如,對于很少使用的小型緩沖區,首選 D24 深度格式可能并不重要。但是,對于 8k 陰影貼圖來說,這可能非常關鍵。以下建議應與使用 NVIDIA NSight 診斷性能問題和驗證改進相結合。
推薦
- 使用 32 位顏色格式(
DXGI_FORMAT_R11G11B10_FLOAT
)而不是 64 位顏色格式(DXGI_FORMAT_R16G16B16A16_FLOAT
),以減少所需的帶寬。 - 使用 D24 或 D16 深度格式可獲得最佳性能。
- 在頂點數允許的情況下使用 16 位索引。
- 使用
CopyTextureRegion
時,復制深度模具紋理時要小心,因為僅復制資源的深度部分可能會遇到緩慢的路徑。 - 常量緩沖區和結構緩沖區在現代 GPU 上的性能類似,但請注意,只有在統一訪問緩沖區內容時,才應使用常量緩沖區
致謝
感謝帕特里克·尼爾、迪拉杰·庫馬爾、伊萬·費多洛夫和朱哈·斯霍姆的建議和幫助
?