目錄
?1??什么是DrawCall?
?2??DrawCall為什么會影響游戲運行效率?
?3??如何減少 DrawCall?(結合性能分析工具)
?1??什么是DrawCall?
DrawCall(繪制調用)?是 GPU 的一個指令,用于通知 GPU 渲染一個或多個對象。每次 DrawCall 會觸發 GPU 執行一次完整的渲染流程(如頂點處理、紋理采樣、著色等)。在 Unity 中,每個材質不同的物體、不同的紋理或不同的著色器參數,通常都會產生獨立的 DrawCall。
?2??DrawCall為什么會影響游戲運行效率?
為什么 DrawCall 會影響效率?這里可能涉及到 GPU 的處理流程。每次 DrawCall 需要切換狀態,比如材質、紋理、著色器等,這些狀態切換會消耗時間。如果 DrawCall 過多,GPU 可能會在狀態切換上花費太多時間,導致幀率下降。需要確認狀態切換的具體影響,以及是否有其他因素,比如頂點處理的時間。CPU 需為每個 DrawCall 準備數據并發送到 GPU,高頻率的 DrawCall 會占用 CPU 資源,影響主線程性能。過多 DrawCall 會導致 GPU 頻繁啟停渲染流水線,增加延遲。
?3??如何減少 DrawCall?(結合性能分析工具)
1.透明物體需額外處理混合順序(
//透明物體需額外處理混合順序的核心原因是:
混合依賴背景色?→ 必須后渲染且按從后到前順序。
深度緩沖不寫入?→ 渲染順序直接影響視覺效果。
),導致無法批處理。盡量減少透明材質使用,或合并透明物體。
2.為物體創建不同細節層次的模型(LOD Groups)。遠處物體使用低精度模型,減少渲染頂點數和 DrawCall。
3.在 Camera 的 Culling Mask 中啟用遮擋剔除。通過烘焙或實時計算,僅渲染可見物體,減少不必要的 DrawCall。
4.在可能的情況下,多個物體使用同一材質實例,避免因材質差異產生額外 DrawCall。
5.通過 Shader Variant Stripping 剔除未使用的著色器變體。在 Player Settings 中啟用 “Strip Shader Variants”。
6.將多個小紋理合并為一個大圖集,減少紋理切換。在 Unity 中創建 Sprite Atlas 并分配紋理。
7.合理使用批處理。(動態批處理[動態批處理是在運行時自動合并符合條件的物體,需要注意動態批處理可能因為物體移動或縮放而失效。]和靜態批處理[靜態批處理是在烘焙時將多個物體合并成一個網格,這樣在運行時只需要一次 DrawCall。])(靜態批處理需要在 Inspector 中勾選 Static 選項,而動態批處理在項目設置中啟用。在 Edit > Project Settings > Graphics 中開啟 Dynamic Batching。注意材質的共享,因為不同材質無法合并,這會影響批處理的效果。)