與多材質(zhì)的 DrawCall 差異及合批機(jī)制解析)
開(kāi)場(chǎng)上周 Code Review 時(shí),小李提交了一個(gè)"性能優(yōu)化"PR:把場(chǎng)景里 200 個(gè)裝飾物合并成了一個(gè)材質(zhì),信心滿滿地說(shuō)"這樣就只有 1 個(gè) DrawCall 了"。我打開(kāi) Frame Debugger 一抓,DrawCall 數(shù)字依然在 80 左右徘徊。小李當(dāng)場(chǎng)愣住了——這就是今天要聊的經(jīng)典誤區(qū):一個(gè)材質(zhì) ≠ 一個(gè) DrawCall,而反方向的推論"兩個(gè)材質(zhì) = 兩個(gè) DrawCall"也只是理論下限,實(shí)際往往更多。很多團(tuán)隊(duì)把"減少材質(zhì)數(shù)"當(dāng)成萬(wàn)能優(yōu)化藥方,卻忽視了真正決定 DrawCall 數(shù)量的整條因果鏈:Pass 數(shù) → 渲染狀態(tài)分組 → 合批窗口 → 每實(shí)例數(shù)據(jù)。這篇文章就沿著這條鏈往下挖,先建立正確的心智模型,再講清楚"切材質(zhì)為什么貴",最后給出能落地的優(yōu)化清單。一、DrawCall 與材質(zhì)的真實(shí)關(guān)系1.1 正確的心智模型:DrawCall 按"渲染狀態(tài) × Pass"計(jì)數(shù)先把結(jié)論釘死:DrawCall 的數(shù)量 ≈ Σ(每個(gè)互不相同的渲染狀態(tài)組 × 該狀態(tài)在每個(gè) Pass 中需要繪制的批次)。材質(zhì)只是"渲染狀態(tài)組"里最顯眼的一個(gè)成員。除了 Shader 和貼圖,陰影開(kāi)關(guān)、Light Probe 用法、渲染隊(duì)列、甚至 Per-Renderer 數(shù)據(jù)的差異,都會(huì)把物體踢進(jìn)不同的組。所以:一個(gè)材質(zhì),N 個(gè) DrawCall:200 個(gè)物體共享一個(gè)材質(zhì),但 Shader 有 ForwardLit + ShadowCaster + D