這篇文章介紹了 NVIDIA GPU s 上的屏障的最佳實踐。要在應用程序中獲得高且一致的幀速率,請參閱所有高級 API 性能提示.
為了在我們的硬件上獲得最佳性能,以下是在 DX12 或 Vulkan 中使用屏障時應該做和不應該做的事情。這是從DX12 注意事項更新的。
推薦
- 盡量減少使用障礙物和圍欄。任何障礙物或柵欄都會限制平行度。我已經看到冗余屏障和相關的等待空閑操作是 DX11 到 DX12 端口的主要性能問題。
- DX11 驅動程序在減少障礙方面做得很好。在 DX12 下,您必須這樣做。
- 確保始終使用最小的資源使用標志集。冗余標志可能會觸發冗余刷新和暫停,并不必要地降低游戲速度。同樣,我看到冗余或過于保守的屏障標志及其相關的等待空閑操作是 DX11 到 DX12 端口的主要性能問題。
- 不要使用
D3D12_RESOURCE_USAGE_GENERIC_READ
,除非您確實需要在這些標志組合中設置的每個標志。
- 不要使用
- 在
ID3D12CommandList::ResourceBarrier
中指定最小目標集。添加虛假依賴項會增加冗余。 - 在一次呼叫
ID3D12CommandList::ResourceBarrier
中分組障礙。這樣,可以選擇最壞的情況,而不是依次通過所有障礙。 - 使用單個空到空的別名資源屏障,而不是多個(例如, 200 +資源到空的屏障)。在驅動程序中可能是相等的,處理所有這些數據可能會浪費 CPU 個周期。
- 如有可能,使用分離式屏障。
- 使用
D3D12_RESOURCE_BARRIER_FLAG_BEGIN_ONLY
和D3D12_RESOURCE_BARRIER_FLAG_END_ONLY
標志。這有助于驅動程序優化過渡工作負載的調度。
- 使用
- 使用圍欄向
ExecuteCommandLists
發送事件信號或跨越呼叫。
不推薦
- 不要插入多余的屏障:
- 從
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE
到D3D12_RESOURCE_STATE_RENDER_TARGET
再到D3D12_RESOURCE_STATE_RENDER_TARGET
的轉換是多余的,其間沒有任何draw調用。
- 避免閱讀障礙。為所有后續讀取獲取處于正確狀態的資源。
- 從
- 沒有充分的理由不要使用
D3D12_RESOURCE_USAGE_GENERIC_READ
。- 對于從寫入狀態到讀取狀態的轉換,請確保轉換目標包含下一次寫入轉換之前所需的所有讀取狀態。這是通過組合讀取狀態標志從 API 完成的,在后續的
ResourceBarrier
調用中,最好是從讀取轉換為讀取。
- 對于從寫入狀態到讀取狀態的轉換,請確保轉換目標包含下一次寫入轉換之前所需的所有讀取狀態。這是通過組合讀取狀態標志從 API 完成的,在后續的
- 除非絕對需要,否則不要將
D3D12_RESOURCE_STATE_COMMON
狀態用于非初始狀態。D3D12_RESOURCE_STATE_COMMON
是可升級到讀和寫狀態的狀態,因此它使驅動程序選擇最差的同步度量。
?