这是我在《Unity游戏优化 (第2版)》看的,记录一下~
Unity也提供了第二种批处理机制:静态批处理
其最大的区别就是:
只能处理标记为Static的对象,因此叫静态批处理
静态批处理的要求:
1.网格必须标记为Static(里面的Batching Static)
通过Inspecter面板设置
缺点就是不能修改对象的变换(移动、旋转、缩放)
2.每个被静态批处理的网格都需要额外的内存
取决于批处理网格中复制的次数
静态批处理工作时,会把所有标记为static的可见网格数据复制到一个更大的网格数据缓冲区中,并通过一个DrawCall传到渲染管线中,同时忽略原始网格
如果进行静态批处理的网格各不相同,那么与正常渲染对象相比,不会增加内存的使用量,因为存储网格需要的空间量是相同的
咋用静态批处理会浪费内存呢?
比如有1000个树:
a.如果不用静态批处理,渲染1000个和1个的内存消耗是相同的,因为他们都引用相同的网格数据,在这种情况下去别的就是每个对象的变换,
b.如果启用了批处理,那么就会将1000个树合成一个大的网格,都存到缓冲区中,每个都存了一个世界坐标,这样就会造成1000倍的内存消耗
3.合并到静态处理中的顶点数量是有上限的(和动态的差不多)
4.网格实例可以来自任何网格数据源,但他们必须使用相同的材质饮用
使用不同的材质会被分配到不同的静态批处理组,每个组有单独的材质
注意:
1.DrawCall需要运行才能看到
2.在运行场景后加入的Batching Static对象,不能自动包含到静态批处理处理中
(因为会重新计算网格与渲染管线同步之间造成巨大的运行开销,所以不会被执行。可以使用StaticBatchUtility.Combine()方法)
网友评论