Unity性能优化-静态合批

发布时间 2023-10-02 03:18:10作者: ZERO_BEYOND

静态合批也叫静态批处理,是Unity的一种优化技术。

对于始终静止不动的物体使用静态合批后,CPU会把它们合并为一个批次发送给GPU处理,这样可以减少Draw Call带来的性能消耗,从而提升游戏性能。

官方文档:https://docs.unity3d.com/cn/current/Manual/static-batching.html

要使用静态合批,必须确保Edit——Project Settings——Player——Other Settings——Static Batching是勾选的。

把一个物体设置为静态的方法:
选中该物体,点击在Inspector窗口右上角的Static右方的下拉菜单,选择Batching Static。

使用静态合批虽然可以提升游戏性能,但是设置为静态的物体在整个游戏中就不能再运动了,强行使它们运动会出问题。

而且即使按照以上步骤进行了静态合批,也不一定保证会成功,必须满足以下全部条件,静态合批才会成功:
1、游戏对象处于激活状态。
2、游戏对象有一个Mesh Filter组件,并且该组件已启用。
3、Mesh Filter组件具有对网格的引用。
4、网格已启用Read/Write功能。
5、网格的顶点计数大于0。
6、该网格尚未与另一个网格组合。
7、游戏对象有一个Mesh Renderer组件,并且该组件已启用。
8、网格渲染器组件不将任何材质与DisableBatching标记设置为true的着色器一起使用。
9、要批处理在一起的网格使用相同的顶点属性。例如,Unity可以将使用顶点位置、顶点法线和一个UV的网格与另一个UV进行批处理,但不能将使用顶点定位、顶点法线、UV0、UV1和顶点切线的网格进行批处理。

即使静态合批成功,合出来的每个批次可以包含的网格顶点数是有限的,最多是64000个顶点。如果超过这个数,则会创建到另一个批次中。

如果要在游戏运行时进行静态合批,则可以使用StaticBatchingUtility类的Combine方法。

StaticBatchingUtility.Combine(GameObject 根物体)
对指定的根物体的所有子孙物体进行静态合批。
只有当它们符合静态合批的所有条件,静态合批才会成功。
成功之后,这些物体就不能再运动了,强行运动会出问题。但是该根物体仍然允许运动。

StaticBatchingUtility.Combine(GameObject[] 要进行静态合批的游戏对象,GameObject 根物体)
对指定的游戏对象进行静态合批,并指定它们静态合批的根物体。
只有当它们符合静态合批的所有条件,静态合批才会成功。
成功之后,这些物体就不能再运动了,强行运动会出问题。但是该根物体仍然允许运动。