下面是一份系统化的 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)
选中 GameObject,Inspector 勾选 “Static” → “Batching Static”
编辑器打包时会将相同材质的静态 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
在模型上添加
LODGroup
组件为不同距离添加多套不同简化级别的 Mesh
视锥剔除(Frustum Culling)
引擎自动开启,无需额外配置
遮挡剔除(Occlusion Culling)
Window → Occlusion Culling,烘焙场景
自动剔除被实景遮挡的物体,减少渲染
6. 骨骼动画网格优化
减少骨骼影响数
在模型导出前,将每顶点最多骨骼权重数限制在 4 个以内
合并骨骼(Skinned Mesh Combine)
对静态或少量动画模型,考虑先烘焙动画为顶点动画后合并
7. 网格简化工具
Unity ProBuilder Simplify:内置简单简化
Third-Party
Simplygon(付费/Unity 内置)
Mesh Baker(合批/简化)
8. 杂项建议
材质合并与贴图集:将多个小材质合并到同一贴图集,减少 Material 切换
剔除无用数据:去除法线、切线、次级 UV(如不需要 Lightmap)
Streaming Mesh:对超大地形或开放世界,分块加载与卸载
综合运用以上方法,可在导入阶段、编辑阶段、运行时三层面均衡优化 Unity 场景。开始时先用 Profiler 定位瓶颈,再针对性采用对应手段,最终实现更高的帧率与更低的内存占用。祝你的项目性能大幅提升!