比如游戏各个模型是独立的,它们的材质以及贴图很有可能是完全一样的,但是由于一些模型数据不一样,放入Unity中会占很多DrawCall,所以Unity提供了一个属性来做静态合批,可以将它们合并在一个Mesh里。
//--设置静态合批
首先在Edit→Project Settings→Player中勾选Static Batching静态合批和Dynamic Batching动态合批复选框。
接着,比如两个Cube都选中Batching Static标记,然后运行游戏。
Mesh Filter会自动生成一个新的Mesh。
这样如果有相同材质 Shader 并且参数一致的话,就会合并DrawCall。
静态合批的最大顶点数是65535,如果定点数超过了它,Unity就会自动合并出多个Mesh。
//--脚本静态合批
自动的静态合批用起来很方便,但是也是有隐患。加入场景很大,合并出来的Mesh就会很大。游戏运行后只要有一小部分出现在摄像机内,那么整个大的Mesh都需要参与渲染。还有最大定点数的限制。
我们可以利用脚本来动态设置需要合并在一起的游戏对象,游戏对象不需要选中Static标记。
using UnityEngine;
public class StaticBatchingByScript : MonoBehaviour
{
public GameObject[] cubes;
private void Start()
{
StaticBatchingUtility.Combine(cubes, gameObject);
}
}
如图:
代码含义就是将数组中的游戏对象合并在同一个Root节点下,也就是第二个参数。
另外运行游戏后合并过的Mesh 对象是不可以发生位移的,但是可以移动他们指定的Root节点。
//--动态合批
动态合批是全自动的,我们不需要做任何事情。但是它是有要求的,Mesh的顶点数量要小于300。如果Shader中使用了顶点位置 法线 UV0 UV1 和切线,Mesh的定点数必须小于180。(在粒子特效中它发挥了很大的优势)。
//--静态合批的隐患
静态合批的原理就是自动生成Mesh,但是不同的Mesh保存的信息可能是不同的。例如Mesh中可能会保存color 和 tangent,但是大部分Mesh都是不需要这个信息的,如果静态合批中有一个Mesh包含了这个信息,那么合并后整个Mesh都会带上它,这样无疑会增加一些额外的开销。
很多时候是美术在导出FBX时,操作不当导致添加了没用的color 和 tangent信息,所以可以利用FBX官网提供的FBX接口,自己写一个Python脚本来删除它们。
没有脚本,我不会Python,哈哈。等会了加上。