Unity Mesh网格合并

Mesh网格合并通常是优化中常用的小手段,目的是为了减少drawcall,大量的drawcall会造成CPU的性能瓶颈。例如下图中船只里的钢材货物,由诸多钢材模型堆砌而成。

 

我们将其放在一个空场景里查看Stats信息,可见Batches指数为94

 下面我们进行网格合并,将所有的钢材合并为一个Mesh,代码如下:

if (GUILayout.Button("Combine"))
{
    List<Material> materials = new List<Material>();
    List<CombineInstance> combineInstances = new List<CombineInstance>();
    for (int i = 0; i < Selection.objects.Length; i++)
    {
        GameObject gameObject = Selection.objects[i] as GameObject;
        if (gameObject == null) continue;
        MeshFilter filter = gameObject.GetComponent<MeshFilter>();
        if (filter == null || filter.sharedMesh == null) continue;
        EditorUtility.DisplayProgressBar("Mesh Combine", "Combine " + filter.sharedMesh.name, (float)i + 1 / Selection.objects.Length);

        combineInstances.Add(new CombineInstance()
        {
            mesh = filter.sharedMesh,
            transform = filter.transform.localToWorldMatrix
        });

        MeshRenderer renderer = gameObject.GetComponent<MeshRenderer>();
        materials.AddRange(renderer.sharedMaterials);
    }
    EditorUtility.ClearProgressBar();
    GameObject combine = new GameObject("Combined Mesh");
    MeshFilter meshFilter = combine.AddComponent<MeshFilter>();
    meshFilter.mesh = new Mesh { name = $"Combined Mesh {Guid.NewGuid()}" };
    meshFilter.sharedMesh.CombineMeshes(combineInstances.ToArray(), mergeSubMeshes);
    MeshRenderer meshRenderer = combine.AddComponent<MeshRenderer>();
    meshRenderer.materials = materials.ToArray();
}

合并后的MeshRenderer只需要保留一个材质球: 

 

再看一下Stats面板中的信息可以发现Batches指数已经由92变为42:

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CoderZ1010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值