- 除非真的需要,否則請避免使用任意命中與交集著色器。使用時,這兩種著色器類型都會大幅增加周遊與排程的成本。這是我們在未來 Microsoft Game Development Kit (GDK) 版本中將著重最佳化的領域。
- 避免超過第 1 層的遞迴。這會增加堆疊壓力,進而減少同時執行中的光線數量。
- 盡量減少跨越 TraceRay 呼叫位置的存活變數數量。這些變數必須在執行 TraceRay 之前寫入記憶體,並在 TraceRay 傳回時從記憶體還原。
- 盡可能避免將 TraceRay 放在 for 迴圈與巢狀運算式中,最佳位置是光線產生著色器的函式範圍。將 TraceRay 放在複雜的流程下會增加程式碼大小,並降低指令快取 (I$) 的命中率。
- 由於共用 VGPR 配置,合併在 RTPSO 中的著色器必須以「最差情況佔用率」執行。建議為不同的光線追蹤效果使用個別的 RTPSO。如果 RTPSO 的 VGPR 數量仍然很高,請考慮在光線追蹤著色器中使用
#define __XBOX_MAX_VGPR_COUNT {REGISTER COUNT},強制著色器編譯器在超過設定的限制時溢出暫存器。這會以記憶體溢出導致的著色效能降低,換取較高佔用率帶來的更佳周遊效能。由於周遊通常佔光線追蹤時間的很大一部分,這可能整體而言是有利的。請嘗試將此值設定為低於總 VGPR 數量的 8 的倍數,並分析效能變化。 - XDXR 目前不會內嵌小型著色器繫結資料表。如果任意命中/最近命中著色邏輯很簡單 (例如 AO 或陰影),建議使用 XDXR 獨立周遊以改善效能與佔用率。
- XDXR 驅動程式會為 DXR 1.0
TraceRay()風格的周遊配置後備記憶體。如果您的遊戲只使用內嵌光線追蹤,您可能會想回收這些記憶體。截至 2022 年 6 月,此記憶體在 XBOX Series S 上為 12MB,在 XBOX Series X 上為 32MB。若要停用此記憶體,遊戲應在 D3D12XBOX_CREATE_DEVICE_PARAMETERS 中為pDXRStackBuffer指定D3D12_GPU_VIRTUAL_ADDRESS_UNKNOWN,並為DXRStackBufferOverrideSizeBytes指定大小0。 - XDXR 的內嵌標頭版本包含可改善任意命中效能的 InlineAHS() 機制,請盡可能使用此機制以簡化周遊流程。
- 遵循一般的光線追蹤最佳做法,盡量減少 BVH 建置中重疊的包圍盒。若無法變更內容,請考慮使用 XDXR BVH 建置器中所述的 TAPU 功能。
- 避免幾何中出現細長的三角形。這些三角形會導致包圍盒中有大量的空白空間。離線建置器可以將三角形分割成多個包圍盒,但仍建議變更內容,而且執行階段建置器必須變更內容。
- 內容問題可能會導致光線追蹤效能嚴重下降。選取 Dispatch 或 DispatchRays 呼叫中使用的任何 BVH 資源,PIX 的 BVH 檢視器即可顯示高成本區域的熱度圖。PIX 也可以顯示光線追蹤事件期間所投射光線的色彩編碼且可篩選的檢視。請參閱 PIX BVH 檢視器。
- 使用 XDXR (XBOX DXR) (實作詳細資料) 中提及的
XDXR_*延伸功能,在不增加承載大小的情況下查詢周遊狀態。 - 對於陰影或非光澤反射等高度一致的工作負載,請考慮將
XBOX_RAY_FLAG_COHERENT_RAYS_HINT加入 DXR 1.0TraceRay()光線旗標中。此旗標會啟用針對這類工作負載最佳化的新周遊類型,可能會在某些內容上大幅提升效能。光線旗標與 TLAS 指標必須一致 (uniform) 才能啟用此周遊類型。對於TraceRayInline(),對應的標頭為XDXRStandaloneTraverseHT.hlsli。
XDXR 最佳做法與建議
XDXR 最佳做法與建議
XBOX DXR (XDXR) 推出已有一段時間,但我們仍持續擴充並改善 XBOX Series X|S 主機上的光線追蹤支援。請持續查看此處以及 https://aka.ms/gdkdl 上 ATG 簡報中的新建議。
Last modified on October 6, 2026
