Unity 渲染優化全解析:Draw Call、Batch、SetPass 與批處理技術
在 Unity 開發中,性能優化是保證游戲流暢的核心環節。尤其在移動端或 VR/AR 場景,Draw Call 過多、材質切換頻繁都會嚴重影響幀率。
本文將從 Unity Statistics 面板參數解析入手,深入講解 Dynamic Batching、Static Batching 與 GPU Instancing,并提供實用優化策略和排查方法,幫助開發者快速提升渲染性能。
文章目錄
- Unity 渲染優化全解析:Draw Call、Batch、SetPass 與批處理技術
- 一、Unity Statistics 參數解析
- 核心參數說明
- 1.1 Dynamic Batching(動態批處理)
- 1.2 Static Batching(靜態批處理)
- 1.3 GPU Instancing(GPU 實例化)
- 二、Unity Draw Call 優化策略
- 三、Unity 各批處理功能啟用方法
- 3.1 Dynamic Batching
- 3.2 Static Batching
- 3.3 GPU Instancing
- 四、總結
一、Unity Statistics 參數解析
在 Unity 中,打開 Ctrl+7(Profiler) 或者 Stats 面板,可以看到場景渲染的核心指標:
核心參數說明
參數 | 含義 |
---|---|
SetPass Calls | 材質切換次數,每次切換都會觸發 GPU 管線狀態更新,CPU 開銷較大 |
Draw Calls | 實際提交給 GPU 的繪制調用次數 |
Batches | Unity 優化后的批處理數量(經過 Dynamic/Static Batching 或 Instancing) |
Triangles | 場景中三角形總數 |
Vertices | 頂點總數 |
Tips:
Batches
通常小于Draw Calls
,說明 Unity 已經對部分對象進行了批處理優化。
1.1 Dynamic Batching(動態批處理)
-
作用:將小型可移動 Mesh 合并成一個 Draw Call。
-
要求:
- 頂點數 ≤ 300
- 相同材質
- 對象可移動(非 Static)
- Shader 支持 Dynamic Batching
-
特點:
- 小型道具、裝飾物常用
- CPU 端合并,開銷較小
-
數據示例:
Batched Draw Calls: 8
Batches: 6
Triangles: 8.9k
Vertices: 15.1k
注意:如果對象同時勾選 Static,Dynamic Batching 會被禁用。
1.2 Static Batching(靜態批處理)
-
作用:將靜態 Mesh 合并頂點緩沖,減少 Draw Call。
-
要求:
- 對象必須勾選 Static → Batching Static
- 可處理大型 Mesh
-
特點:
- CPU 端開銷較高
- GPU Draw Call 顯著減少
- 與 GPU Instancing 沖突,啟用 Static 后 Instancing 不生效
-
數據示例:
Batched Draw Calls: 996
Batches: 41
Triangles/Vertices: 顯示為 0(Unity 統計方式)
使用 Static Batching 后,Statistics 面板中 Batches 數量減少,Saved by Batching 數量增加,說明 Draw Call 被合并。
1.3 GPU Instancing(GPU 實例化)
-
作用:一次 Draw Call 繪制大量相同 Mesh 的實例,適合重復物體(樹、草、箱子)。
-
生效條件:
- 所有實例使用同一個材質 Asset,并勾選 Enable GPU Instancing
- Shader 支持 Instancing(帶
#pragma multi_compile_instancing
) - Mesh 必須一致
- 對象在場景中被渲染(Active + Renderer enabled)
- ShadowCaster、LightProbe 等特殊效果可能干擾
-
特點:
- CPU 開銷低,GPU 端直接繪制實例
- Draw Call 顯著減少,但 Batches 統計不一定立即變化
-
常見問題:
-
啟用 Instancing 后 Statistics 未變化:
- 材質不完全共享
- Shader 不支持 Instancing
- Shadow/LightProbe 干擾
- Stats 面板刷新滯后
-
-
排查方法:
- Frame Debugger:查看 Instanced Mesh 是否合批
- 確認材質和 Shader 設置
- 暫時關閉 Shadow、LightProbe 測試
示例:154 個相同材質的 Mesh,如果 Instancing 沒生效,Statistics 面板 Batches 數量不會減少。
二、Unity Draw Call 優化策略
特性 | Dynamic Batching | Static Batching | GPU Instancing |
---|---|---|---|
對象狀態 | 可移動 | 靜態 | 可移動或靜態 |
頂點限制 | ≤ 300 | 無限制 | 無限制 |
材質要求 | 相同材質 | 可不同 | 相同材質 |
Shader 要求 | 支持 Dynamic | 任意 | 支持 Instancing |
Draw Call 優化 | CPU 合并小 Mesh | CPU 合并靜態 Mesh | GPU 同時繪制實例 |
適用場景 | 小道具、裝飾 | 大場景靜態建筑、地形 | 大量重復物體(樹、草) |
性能開銷 | CPU 較小 | CPU 較高 | CPU 較低,GPU 優化 |
實用策略:
- 小型道具 → Dynamic Batching
- 大型靜態場景 → Static Batching
- 大量重復物體 → GPU Instancing
- 組合策略 → 根據對象類型選擇不同方法,避免沖突
三、Unity 各批處理功能啟用方法
3.1 Dynamic Batching
-
全局開關:
- Edit → Project Settings → Player → Other Settings → Rendering → 勾選 Dynamic Batching
參考文檔:
https://docs.unity.cn/6000.2/Documentation/Manual/dynamic-batching-enable.html
-
對象要求:
- 頂點數 ≤ 300
- 可移動
- 相同材質
- Shader 支持 Dynamic Batching
-
檢查生效:
- Profiler → Dynamic Batching → Batched Draw Calls > 0 表示已生效
3.2 Static Batching
- 勾選 Static → Batching Static
- 注意與 GPU Instancing 沖突
啟用后 Batches 數量減少,Saved by Batching 增加
3.3 GPU Instancing
- 材質 Inspector → 勾選 Enable GPU Instancing
- 確認 Shader 支持 Instancing
- Frame Debugger 查看實例化是否生效
- 避免與 Static Batching 沖突
四、總結
-
SetPass Calls / Draw Calls / Batches 是衡量渲染性能的核心指標:
- Draw Call → GPU 調用次數
- SetPass Call → 材質切換次數(CPU 開銷)
- Batches → 批處理優化后 Draw Call 數
-
Dynamic Batching:小物體移動時自動優化
-
Static Batching:靜態物體優化 Draw Call,但會禁用 Instancing
-
GPU Instancing:大量重復物體首選,CPU 開銷低,GPU 實例化繪制
-
優化策略:小物體用 Dynamic、靜態大物體用 Static、重復物體用 Instancing,組合使用效果最佳