這是我在《Unity游戲優(yōu)化 (第2版)》看的急但,記錄一下~
動態(tài)批處理可以降低DrawCall赫段,他有啥優(yōu)勢呢融师?
1.批處理在運行時生成(批處理是動態(tài)產(chǎn)生的)
2.批處理中包含對象在不同的幀之間可能有所不同奠旺,這取決于哪些網(wǎng)格在主攝像機視圖中當前是可見的
3.甚至能在場景中運動的對象也可以批處理
舉個例子:
首先需要需要關閉影子顯示
關閉靜態(tài)動態(tài)批處理
關閉天空盒子
如圖所示宦棺,為啥有9個DrawCall呢舌缤?
1.有1個批處理渲染場景的背景
2.剩余8個批處理渲染8個對象
那么要是開啟動態(tài)批處理呢箕戳?
會 減少3個DrawCall(跟在場景的深度有關系某残,要把球放在方塊后面)
因為四個立方體可以合并成一個 Dynamic Batch DrawCall中
但是四個球依然通過獨立的DrawCall渲染,因為其不滿足合批要求(定點數(shù)不超過300)
那么動態(tài)批處理的規(guī)則是什么呢陵吸?
1.所有網(wǎng)格實例必須使用相同的材質引用
2.只有ParticleSystem和MeshRenderer組件可以進行動態(tài)批處理(SkinnedMeshRenderer組件和其他所有可渲染的組件都不能進行批處理)
3.每個網(wǎng)格至多有300個頂點
4.著色器使用的頂點屬性數(shù)不能大于900
5.所有網(wǎng)格實例要么使用等比縮放玻墅,要么使用非等比縮放,但是不能兩者混用
6.網(wǎng)格實例應引用相同的光照紋理文件
7.材質的著色器不能依賴多個過程
8.網(wǎng)格實例不能接受實時投影
9.整個批處理中網(wǎng)格索引的總數(shù)有上限壮虫,和GraphicsAPI有關系澳厢,一般在32~64K之間
詳細解釋:
啥玩意是頂點屬性?(4)
頂點屬性是網(wǎng)格文件中基于每個頂點的一段信息囚似,每一段通常表示為一組浮點數(shù)
包括:
a.頂點位置(相對于網(wǎng)格的Root)
b.法線向量(一個從對象表面指向外面的向量)
c.一套或多套紋理UV(定義一張或多張紋理如何包裹網(wǎng)格)
d.每個頂點的顏色信息
只有這些總數(shù)小于900的網(wǎng)格才可以進行動態(tài)批處理(查看inspterect的Preview里面的verts值)
著色器中剩拢,每個頂點使用的屬性越多,網(wǎng)格允許擁有的定點數(shù)量就越少
比如:
漫反射的定點需要3個屬性:位置饶唤、法線徐伐、UV
如果想用動態(tài)批處理就最多有300個頂點的網(wǎng)格
自動生成的球有515個頂點,共有1545個頂點屬性募狂,所以不能批處理
啥玩意是網(wǎng)格縮放呢办素?
等比縮放是xyz三個分量都相同
非等比縮放是xyz至少有一個是不同的
比如:
A(1,1祸穷,1)性穿,B(2,1雷滚,1)需曾,C(2,2揭措,1)胯舷,D(2,2绊含,2)
A和D就是等比縮放桑嘶,會在一個批處理中
B和C就是非等比縮放,會在另一個批處理中
如果為負數(shù)縮放躬充,與負數(shù)值的奇偶個數(shù)有關
a.如果只有一個或者三個軸是負數(shù)逃顶,會放在一個批處理中
b.如果沒有或者對兩個軸是負數(shù),會放在另一個批處理中
V(1充甚,1以政,1),W(-1伴找,1盈蛮,1),X(-1技矮,-1抖誉,1)殊轴,Y(-1,-1袒炉,-1)旁理,Z(1,1我磁,1)
本來以為:V和Z是一樣的孽文,會放在一個批處理中
但是卻不會
總結:
渲染大量簡單網(wǎng)格,動態(tài)批處理就很有用
比如大量外觀幾乎相同的簡單物體:
1.到處是石頭夺艰、樹木或者灌木林
2.有很多簡單而常見的元素
2.簡單的集合體和粒子特效等
啥時候批處理對性能有損害呢芋哭?
場景中有數(shù)百個簡單對象,但是每個批處理只有幾個對象
這樣檢測和生成這么多小批處理組的開銷成本就會比為每個單獨網(wǎng)格執(zhí)行DrawCall開銷還要多