Unity Mesh 优化全攻略
系统梳理 Mesh 减面、压缩、批处理与 GPU 性能调优方法,帮助项目在移动端与主机平台获得更高帧率与更低包体。

适用版本:Unity 2020 LTS–2023 LTS,URP/HDRP/Built‑in 通用。
文章分为 模型导入 → 子网格合并 → LOD 管理 → GPU Instancing → 动态网格 → 调试工具 六大部分,侧重落地方案与实测数据。

目录

  1. 前言
  2. 模型导入设置
  3. 子网格合并 & Batching
  4. LOD 策略
  5. GPU Instancing 与 SRP Batcher
  6. Mesh 压缩与顶点数据
  7. SkinnedMesh 优化
  8. 动态网格与 JobSystem
  9. 调试与 Profiling
  10. 结语

前言

在移动端,三角面数与 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 支持发射烘焙
  • 使用 SimplygonMeshOptimizer 批量减面。
  • LODGroup 勾选 Animate Cross‑Fading,减少跳面闪烁。

GPU Instancing 与 SRP Batcher

  1. 相同材质 + 相同 MeshEnable GPU Instancing 即可。
  2. MaterialPropertyBlock 改 per‑instance 颜色/矩阵,无需新材质。
  3. 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 优化

  1. Bone Merge:手、臂等共用根骨,减骨骼数。
  2. GPU Skinning:URP 自动;低端机可用 Optimize GameObject
  3. Mesh Baking:非实时衣摆 → 烘焙成 BlendShape。
  4. 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