网格合并优化

网格优化踩坑记录

测试环境:Unity编辑器 2019.2.3f1

合并网格之后发现用来合并的网格在场景中也占用一份内存,也就是说一共占用了两份内存。
代码如下

private void CombineMesh(List meshFilters)
{
        CombineInstance[] combine = new CombineInstance[meshFilters.Count];
        for (int i = 0; i < meshFilters.Count; i++)
        {
            combine[i].mesh = meshFilters[i].sharedMesh;
            combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
        }
        m_terrainMeshCombine = new GameObject("TerrainMeshCombine");
        m_CombineMesh = new Mesh();

        m_terrainMeshCombine.transform.SetParent(transform);
        m_terrainMeshCombine.AddComponent().sharedMaterial = TerrainMeshMat;
        m_terrainMeshCombine.AddComponent().sharedMesh = m_CombineMesh;
        m_terrainMeshCombine.GetComponent().sharedMesh.CombineMeshes(combine);

        m_terrainMeshCombine.GetComponent().sharedMesh.RecalculateBounds();
        m_terrainMeshCombine.GetComponent().sharedMesh.RecalculateTangents();
        m_terrainMeshCombine.GetComponent().sharedMesh.RecalculateNormals(60);//重载的一个方法
        m_terrainMeshCombine.GetComponent().sharedMesh.MarkDynamic();
        m_terrainMeshCombine.GetComponent().sharedMesh.UploadMeshData(false);
}

内存使用情况如下网格合并优化_第1张图片

从Profiler中看到合并的网格和未合并的小网格各占用一份内存,如果使用合并后的网格那么小网格其实是可以删掉的。

修改后如下

private void CombineMesh(List meshFilters)
{
        CombineInstance[] combine = new CombineInstance[meshFilters.Count];
        for (int i = 0; i < meshFilters.Count; i++)
        {
            combine[i].mesh = meshFilters[i].sharedMesh;
            combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
        }
        m_terrainMeshCombine = new GameObject("TerrainMeshCombine");
        m_CombineMesh = new Mesh();

        m_terrainMeshCombine.transform.SetParent(transform);
        m_terrainMeshCombine.AddComponent().sharedMaterial = TerrainMeshMat;
        m_terrainMeshCombine.AddComponent().sharedMesh = m_CombineMesh;
        m_terrainMeshCombine.GetComponent().sharedMesh.CombineMeshes(combine);

        m_terrainMeshCombine.GetComponent().sharedMesh.RecalculateBounds();
        m_terrainMeshCombine.GetComponent().sharedMesh.RecalculateTangents();
        m_terrainMeshCombine.GetComponent().sharedMesh.RecalculateNormals(60);
        m_terrainMeshCombine.GetComponent().sharedMesh.MarkDynamic();
        m_terrainMeshCombine.GetComponent().sharedMesh.UploadMeshData(false);

        for (int i = 0; i < meshFilters.Count; i++)
        {
            Destroy(combine[i].mesh);
            combine[i].mesh = null;
        }
        combine = null;
}

内存使用情况如下网格合并优化_第2张图片

从内存使用情况来看也减少了内存开销。

 

你可能感兴趣的:(网格合并优化)