1:对于具有相同材质的对象,可以通过把他们的Mesh网格(Mesh Filter)合并在一起,然后禁用被合并的对象,来达到减少DrawCall的效果;
void Start ()
{
MeshFilter [] meshFilters = GetComponentsInChildren<MeshFilter> ();
CombineInstance[] combine = new CombineInstance[meshFilters.Length];
for (int i = 0; i < meshFilters.Length; i++) {
combine [i].mesh = meshFilters [i].sharedMesh;
combine [i].transform = meshFilters [i].transform.localToWorldMatrix;
meshFilters [i].gameObject.active = false;
}
transform.GetComponent<MeshFilter> ().mesh = new Mesh ();
transform.GetComponent<MeshFilter> ().mesh.CombineMeshes (combine);
transform.gameObject.active = true;
}
2:对于具有多个不同材质的对象,不仅需要
通过把他们的Mesh网格(Mesh Filter)合并在一起,还要为合并后的Mesh指定材质,然后禁用被合并的对象(不禁用的话,DrawCall不会减少),
且CombineMeshes()的第二个参数必须为false,最后父对象的比例需要为1,1,1
,来达到减少DrawCall的效果;
void Start ()
{
//---------------- 先获取材质 -------------------------
//获取自身和所有子物体中所有MeshRenderer组件
MeshRenderer[] meshRenderers = GetComponentsInChildren<MeshRenderer>();
//新建材质球数组
Material[] mats = new Material[meshRenderers.Length];
for (int i = 0; i < meshRenderers.Length; i++) {
//生成材质球数组
mats[i] = meshRenderers[i].sharedMaterial;
}
//---------------- 合并 Mesh -------------------------
//获取自身和所有子物体中所有MeshFilter组件
MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
CombineInstance[] combine = new CombineInstance[meshFilters.Length];
for (int i = 0; i < meshFilters.Length; i++) {
combine[i].mesh = meshFilters[i].sharedMesh;
//矩阵(Matrix)自身空间坐标的点转换成世界空间坐标的点
combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
meshFilters[i].gameObject.SetActive(false);
}
transform.localScale = Vector3.one;
//为新的整体新建一个mesh
transform.GetComponent<MeshFilter>().mesh = new Mesh();
//合并Mesh. 第二个false参数, 表示并不合并为一个网格, 而是一个子网格列表
transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine, false);
// transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine);
transform.gameObject.SetActive(true);
//为合并后的新Mesh指定材质 ------------------------------
transform.GetComponent<MeshRenderer>().sharedMaterials = mats;
}
3:在编辑模式下,获取Statistics面板的参数:
void OnGUI()
{
GUILayout.TextField("Total DrawCall: " + UnityStats.drawCalls);
GUILayout.TextField("Batch: " + UnityStats.batches);
GUILayout.TextField("Static Batch DC: " + UnityStats.staticBatchedDrawCalls);
GUILayout.TextField("Static Batch: " + UnityStats.staticBatches);
GUILayout.TextField("DynamicBatch DC: " + UnityStats.dynamicBatchedDrawCalls);
GUILayout.TextField("DynamicBatch: " + UnityStats.dynamicBatches);
GUILayout.TextField("Tri: " + UnityStats.triangles);
GUILayout.TextField("Ver: " + UnityStats.vertices);
}