Unity中的各种合批

TODO

注:一定条件下,gup实例化跟动态合批很相似,都是动态地把几个相同材质的物体合成一个批次,至于哪个更节省性能,待研究

gpu实例化跟动态合批,都是要求材质一样,给材质设置属性的时候,有一定限制,比如gpu实例化只能给设置了instancing的参数修改。只能给shareMaticle的MaterialPropertyBlock来设置等等,具体有设么差异,打断方式各是什么,待研究

 

 

Batches:当前共有几个批次
Save by baatching:因为当前的合批省了几个批次

SetPass calls:当前有几个Draw事件(类似Draw Call)

 

Tips:一个Frame Debug小知识,绿色那里显示当前有多少个draw事件,红色表示,当前产生这个新draw call的原因,这里就表示这个Mesh Cube_3使用了新材质,新加了一个dc

 

动态合批:
0.相同材质
1.Project Settings > Player > Other Settings 中确认 Dynamic Batching 是否被勾选
2.对于动态小物体(顶点数少于 300),Unity 会自动尝试进行动态合批,无需在 Inspector 面板中进行特殊设置。
3.超过300顶点的物体,会单独新建一个批次(所以很亏,比如刚好300个顶点,则可以106000/300=35个合一起,而301个的,35个就是35个batches)
4.带有skin wieght的蒙皮属性的mesh,即使小于300点,也无法合批
4.PC上,一个batches最多可以有106000面左右(估计是跟平台有关,可能手机上就小点),超过就下一个batches,好像不是取决于顶点数?
缺点:因为是运行时动态计算的,所以对CPU开销较大,当顶点数超过一定阈值时效果较差。

 

静态合批:
0.相同材质
1.Project Settings > Player > Other Settings 中确认 Static Batching 是否被勾选
2.选中某个静态对象,观察 Inspector 面板中是否勾选了 Static。
3.只能在运行前设置static有用,运行时再设置不生效
4.skin wigeht的mesh也可也合批(不过好像没啥意义,动画动起来好像就会断开合批?)
5.静态合批的一个批次顶点数容量比动态的大得多,测试130K左右
注:实际一个批次最多能多少面,上面测的不准,因为是在原地拷贝复制的,模型都堆叠在一起,分散开后,虽然stats上面的总面数没变化,但是batches明显增多
缺点:占用较多的运行时内存和包体大小,因为所有被合批的几何体会合并为一个大网格。只适用于静态物体

 

GPU实例化:
0.相同材质
1.材质勾选启用gpu instancing
2.批次数量限制


SRP合批:
要求:只适用于URP/HDRP,Shader 必须符合 SRP Batcher 的规则,如必须遵循特定的Uniform结构。
待研究


UI合批:
待研究

posted @ 2024-07-25 11:32  JeasonBoy  阅读(108)  评论(0编辑  收藏  举报