您当前的位置: 首页 >  unity

CoderZ1010

暂无认证

  • 2浏览

    0关注

    168博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Unity Mesh网格合并

CoderZ1010 发布时间:2021-11-09 17:37:06 ,浏览量:2

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

 

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

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

if (GUILayout.Button("Combine"))
{
    List materials = new List();
    List combineInstances = new List();
    for (int i = 0; i < Selection.objects.Length; i++)
    {
        GameObject gameObject = Selection.objects[i] as GameObject;
        if (gameObject == null) continue;
        MeshFilter filter = gameObject.GetComponent();
        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();
        materials.AddRange(renderer.sharedMaterials);
    }
    EditorUtility.ClearProgressBar();
    GameObject combine = new GameObject("Combined Mesh");
    MeshFilter meshFilter = combine.AddComponent();
    meshFilter.mesh = new Mesh { name = $"Combined Mesh {Guid.NewGuid()}" };
    meshFilter.sharedMesh.CombineMeshes(combineInstances.ToArray(), mergeSubMeshes);
    MeshRenderer meshRenderer = combine.AddComponent();
    meshRenderer.materials = materials.ToArray();
}

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

 

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

关注
打赏
1653184800
查看更多评论
立即登录/注册

微信扫码登录

0.0831s