Administrator
发布于 2025-05-23 / 5 阅读
0

Mesh优化教程

下面是一份系统化的 Unity Mesh 优化教程,涵盖从导入设置到运行时组合与剔除等多种手段,帮助你降低顶点数、减少绘制调用、提升渲染效率。


1. 性能指标与分析

  • 顶点/三角形数:查看场景中各模型的 Vertex/Triangle 统计(Scene View 右上角 Stats)

  • Draw Call(批次):使用 Frame Debugger 和 Profiler 中的 Rendering Module,确认哪几类物体占用最多批次

  • GC 分配与内存:注意 Mesh.CombineMeshes、动态生成 Mesh 时的临时分配,避免频繁调 GC


2. 导入设置优化

  • Mesh Compression

    • 在模型 Import Settings → Mesh → Compression,选择 Low/Medium/High 压缩,可大幅减小顶点数据

  • Optimize Mesh

    • 勾选 “Optimize Mesh” 让编辑器在导入时重新排序顶点数据,提高渲染缓存命中率

  • Read/Write Enabled

    • 如不需要运行时修改顶点,将 Read/Write 关闭,节省显存

  • Index Format

    • 对于顶点数 < 65k 的 Mesh,使用 16-bit 索引(Automatic);超过则自动切到 32-bit


3. 合并 Mesh(Combine)

  • 静态合批(Static Batching)

    1. 选中 GameObject,Inspector 勾选 “Static” → “Batching Static”

    2. 编辑器打包时会将相同材质的静态 Mesh 合并,减少 Draw Call

  • 运行时合并

    using UnityEngine;
    
    public class MeshCombiner : MonoBehaviour {
        void Start() {
            var filters = GetComponentsInChildren<MeshFilter>();
            CombineInstance[] combines = new CombineInstance[filters.Length];
            for(int i=0; i<filters.Length; i++){
                combines[i].mesh = filters[i].sharedMesh;
                combines[i].transform = filters[i].transform.localToWorldMatrix;
                filters[i].gameObject.SetActive(false);
            }
            var go = new GameObject("CombinedMesh");
            var mf = go.AddComponent<MeshFilter>();
            go.AddComponent<MeshRenderer>().sharedMaterial = GetComponentInChildren<MeshRenderer>().sharedMaterial;
            mf.mesh = new Mesh();
            mf.mesh.CombineMeshes(combines, true, true);
            go.SetActive(true);
        }
    }
    
    • 注意:合并后无法单独控制子 Mesh 的激活状态


4. 批处理与实例化

  • 动态批处理(Dynamic Batching)

    • 支持顶点数较少(< 300 顶点)的 Mesh,开启 Player Settings → Other Settings → Dynamic Batching

  • GPU Instancing

    • 对完全相同的 Mesh+材质,可在材质 Inspector 勾选 “Enable GPU Instancing”,并用 Graphics.DrawMeshInstanced 批量绘制


5. LOD 与剔除

  • LOD Group

    1. 在模型上添加 LODGroup 组件

    2. 为不同距离添加多套不同简化级别的 Mesh

  • 视锥剔除(Frustum Culling)

    • 引擎自动开启,无需额外配置

  • 遮挡剔除(Occlusion Culling)

    1. Window → Occlusion Culling,烘焙场景

    2. 自动剔除被实景遮挡的物体,减少渲染


6. 骨骼动画网格优化

  • 减少骨骼影响数

    • 在模型导出前,将每顶点最多骨骼权重数限制在 4 个以内

  • 合并骨骼(Skinned Mesh Combine)

    • 对静态或少量动画模型,考虑先烘焙动画为顶点动画后合并


7. 网格简化工具

  • Unity ProBuilder Simplify:内置简单简化

  • Third-Party

    • Simplygon(付费/Unity 内置)

    • Mesh Baker(合批/简化)


8. 杂项建议

  • 材质合并与贴图集:将多个小材质合并到同一贴图集,减少 Material 切换

  • 剔除无用数据:去除法线、切线、次级 UV(如不需要 Lightmap)

  • Streaming Mesh:对超大地形或开放世界,分块加载与卸载


综合运用以上方法,可在导入阶段、编辑阶段、运行时三层面均衡优化 Unity 场景。开始时先用 Profiler 定位瓶颈,再针对性采用对应手段,最终实现更高的帧率与更低的内存占用。祝你的项目性能大幅提升!