Unity Mesh 优化全攻略
系统梳理 Mesh 减面、压缩、批处理与 GPU 性能调优方法,帮助项目在移动端与主机平台获得更高帧率与更低包体。
适用版本:Unity 2020 LTS–2023 LTS,URP/HDRP/Built‑in 通用。
文章分为 模型导入 → 子网格合并 → LOD 管理 → GPU Instancing → 动态网格 → 调试工具 六大部分,侧重落地方案与实测数据。
目录
- 前言
- 模型导入设置
- 子网格合并 & Batching
- LOD 策略
- GPU Instancing 与 SRP Batcher
- Mesh 压缩与顶点数据
- SkinnedMesh 优化
- 动态网格与 JobSystem
- 调试与 Profiling
- 结语
前言
在移动端,三角面数与 DrawCall 一样决定渲染瓶颈;在主机与 VR 场景,Mesh 帧内更新(CPU)与带宽(GPU)也是性能焦点。掌握 Mesh 优化,即可 降面数、减带宽、合批次、提 FPS。
模型导入设置
设置项 | 推荐值 | 说明 |
---|---|---|
Scale Factor | 1 | 避免百分比缩放引入浮点误差 |
Mesh Compression | Low/Medium |
根据视觉损失选择 |
Read/Write | 禁用 | 只在需运行时修改顶点时开启 |
Optimize Mesh | 勾选 | 更优索引缓存命中 |
Normals | Import / Calculate (60°) |
使光照一致 |
Tangents | Calculate MikkTSpace |
PBR 法线贴图需要 |
小贴士:若模型仅做静态展示,可在 DCC 导出时三角优化再导入。
子网格合并 & Batching
1. Static Batching
- 标记
Static
,同一材质可合并到一个大网格。 - 耗内存:合批后生成新的 Combined Mesh,注意静态场景总顶点 < 65k×批次。
2. Dynamic Batching
- 限制:顶点 < 900、同属性布局。
- 移动端可关闭,改用 GPU Instancing 减 CPU。
3. Editor 合并工具
// CombineChildren.cs (核心)
MeshFilter[] filters = GetComponentsInChildren<MeshFilter>();
CombineInstance[] combines = filters.Select(f => new CombineInstance
{
mesh = f.sharedMesh,
transform = f.transform.localToWorldMatrix
}).ToArray();
Mesh combined = new Mesh();
combined.CombineMeshes(combines, true, true);
GetComponent<MeshFilter>().sharedMesh = combined;
LOD 策略
级别 | 面数目标 | 触发距离 | 说明 |
---|---|---|---|
LOD0 | 100% | < 5m | 角色近景 |
LOD1 | 40–60% | 5–15m | 中景 |
LOD2 | 10–20% | 15–40m | 远景 |
Billboard | Quad | > 40m | URP/HDRP 支持发射烘焙 |
- 使用 Simplygon 或 MeshOptimizer 批量减面。
- LODGroup 勾选
Animate Cross‑Fading
,减少跳面闪烁。
GPU Instancing 与 SRP Batcher
- 相同材质 + 相同 Mesh →
Enable GPU Instancing
即可。 MaterialPropertyBlock
改 per‑instance 颜色/矩阵,无需新材质。- URP/HDRP 勾选 SRP Batcher,SetPass 调用最高降 70%。
var mpb = new MaterialPropertyBlock();
mpb.SetColor("_Color", instanceColor[i]);
Graphics.DrawMeshInstanced(mesh, 0, mat, matrices, count, mpb);
Mesh 压缩与顶点数据
通道 | 优化手段 | 备注 |
---|---|---|
位置 | Mesh.OptimizeIndexBuffers() |
16‑bit index < 65k |
法线 | vertexCompression 量化 |
URP 自动 |
颜色 | Color32 替代 Color |
4×32bit → 4×8bit |
UV | 合并多张贴图到 TextureArray | 节省 UV2 |
- iOS/Android 支持 KTX2 + BasisU(Meshopt 支持),降低网格传输体积 30%。
SkinnedMesh 优化
- Bone Merge:手、臂等共用根骨,减骨骼数。
- GPU Skinning:URP 自动;低端机可用 Optimize GameObject。
- Mesh Baking:非实时衣摆 → 烘焙成 BlendShape。
- Bone LOD:高远距禁用指头骨,插值渐进。
动态网格与 JobSystem
[BurstCompile]
public struct DeformJob : IJobParallelFor
{
public NativeArray<float3> verts;
public float time;
public void Execute(int i)
{
verts[i] += math.sin(time + i) * 0.01f;
}
}
// 调度
var job = new DeformJob{ verts = verts, time = Time.time };
handle = job.ScheduleParallel(verts.Length, 64, handle);
mesh.MarkDynamic();
mesh.SetVertices(verts, 0, verts.Length, MeshUpdateFlags.DontValidateIndices);
MarkDynamic 减少顶点上传开销。
调试与 Profiling
- Frame Debugger:查看合批、SetPass、Instancing。
- Rendering Debugger (URP/HDRP) → 杂项 → 顶点密度显示。
- Mesh Statistics 面板:场景/选中三角数、UV Channel。
- PIX (Windows) / Xcode GPU Frame Capture:带宽瓶颈。
结语
Mesh 优化是渲染性能的基石。遵循 导入即减面 → 合批即省 CPU → LOD/Instancing 抑制远景 → 压缩传输省包体 → GPU 友好布局 五步,便能在移动与主机都获得稳帧体验。祝项目顺滑起飞!
附件
Editor/CombineChildren.cs
— 子网格合并脚本Tools/MeshLODGenerator.cs
— LOD 自动化生成Docs/MeshOptimizationChecklist.pdf
— 自查手册
需要更多脚本示例?留言即可获取。
Last modified on 2025-06-09