05 · 性能优化与常见坑点
本章是专业动效师"踩坑清单"。遇到问题先来这里查。
一、性能瓶颈诊断
性能自检顺序
卡顿症状 → 检查项 → 解决
─────────────────────────────────────────────────
视口卡 → Cloner 数量 → 用 Matrix / 减少显示
视口卡 → Shader 每帧重算 → 烘焙 MoGraph Cache
渲染慢 → 实例化未启用 → 启用 Instance
渲染慢 → 阴影设置过高 → 降低阴影采样
渲染慢 → 物理模拟占帧 → Bake Simulation
文件大 → Alembic 精度高 → 降低 Alembic 精度
启动慢 → 加载所有缓存 → 用 `On Demand` 加载性能黄金指标
| 指标 | 警告值 | 严重卡顿值 |
|---|---|---|
| 克隆数量 | > 5000 | > 50000 |
| 效果器数量 | > 8 | > 15 |
| 烘焙前 Subframes | 0 | — |
| Render 实例化 | 关闭 | 开启 |
| GPU 加速 | 未启用 | — |
二、克隆数量优化
决策表
| 数量 | 推荐方案 |
|---|---|
| < 1000 | Cloner |
| 1000 - 10000 | Cloner + 简单效果器 |
| > 10000 | Matrix + 简单效果器 |
| > 100000 | Instancer(非 MoGraph)+ Alembic |
实例化模式对比
| 模式 | 性能 | 灵活性 | 用途 |
|---|---|---|---|
| Cloner (Instance) | ✓✓ | ✓✓ | 默认推荐 |
| Cloner (Render Instance) | ✓✓✓ | ✓ | 大量克隆 |
| Matrix + Display Off | ✓✓✓ | ✓ | 数据可视化 |
| Instance Object | ✓✓✓✓ | ✗ | 极致性能 |
| Thinking Particles | ✓✓ | ✓✓ | 粒子系统 |
三、Shader 性能优化
Shader 重计算检查清单
- [ ] 是否有 Animated Noise(每帧重算)?
- [ ] 是否有贴图读取(每帧采样)?
- [ ] 是否有 Reflection/Refraction?
- [ ] 是否有 Sub-Surface Scattering?
Shader 优化配方
问题: 复杂 Shader 拖慢视口
方案 1: 烘焙 MoGraph Cache(最推荐)
方案 2: 降低 Shader 采样率(Noise Octave 6 → 3)
方案 3: 用 Bake Texture 把 Shader 输出烘焙为贴图
方案 4: 用 Loop Region 只播放部分帧Loop Region(循环区域)
强烈推荐:调试时只播放 [0, 30] 帧,速度提升 5-10x。
设置方法:
- 顶部菜单
Animate > Set Loop Range - 起始/结束帧设为项目范围
四、克隆渲染优化
启用 Render Instance(必做)
Cloner 属性:
Transform > Mode = Iterative (推荐)
Object > Clone > Multi-Instance ✓启用后 1000 个球只用 1 次 Draw Call。
Alembic 缓存导出
File > Export > Alembic
格式: HDF5
Geometry: ✓
Animation: ✓
Use Animation Range: ✓
每 N 帧导出: 1关键 Alembic 优化参数
| 参数 | 默认 | 优化建议 |
|---|---|---|
| Compression | 无 | GZip(文件小 50%+) |
| Step Size | 1 | 1(保持精度) |
| Subdivision | Detailed | Polygon Cache |
| Precision | 自动 | 半精度(大量点时) |
五、动力学性能
物理模拟卡顿
| 症状 | 原因 | 方案 |
|---|---|---|
| Cache 烘焙后还卡 | 子步太多 | 降低 Steps per Frame |
| 模拟不稳定 | 约束弱 | 加 Soft Constraint |
| 模拟太慢 | 碰撞体太精细 | 用简单代理碰撞体 |
| 模拟飞出 | 初始速度过大 | 加 Gravity 平衡 |
动力学缓存策略
Simulation > Cache Tags
Mode = Manual
Cache Range = 0 ~ 200
Disk Cache ✓必须用 Disk Cache,否则 32GB 内存都不够。
六、材质与克隆结合
MultiShader + MoGraph 通道
MultiShader:
Mode = By Index
Shader 1: 金属
Shader 2: 玻璃
Shader 3: 塑料每个克隆根据 Index 自动分配不同材质。
颜色覆盖(最常用)
材质颜色通道:
Enable Colorizer ✓
Source = MoGraph > Color
→ Shader 效果器 输出颜色到这里避免每克隆独立材质
⚠️ 千万不要给每个克隆手动挂材质 → 完全破坏 Instance 优化。
正确做法:
- ✅ MultiShader 配合 MoGraph 通道
- ✅ Shader 效果器直接输出到颜色
- ✅ 使用 Vertex Map(顶点贴图)做差异
七、视图显示优化
视口显示模式
| 模式 | 用途 | 性能 |
|---|---|---|
| Wireframe | 调试几何 | 最快 |
| Bounding Box | 查看范围 | 最快 |
| Isoparm | 建模 | 中 |
| Gouraud Shading | 快速预览 | 慢 |
| Gouraud Shading (Lines) | 带线框的着色 | 中 |
| Quick Shading | 草图预览 | 快 |
| High Quality | 接近最终渲染 | 最慢 |
Display Tag 优化
Display Tag:
Display Mode = Off (渲染时才显示)
On/Off = 距离相机 1000m 以外隐藏视口过滤
- 菜单:
View > Filter > Objects/Generators/Effectors选择性显示 - 用
HUD实时查看 FPS
八、20 大常见坑点清单
渲染问题
| # | 现象 | 原因 | 解决 |
|---|---|---|---|
| 1 | 克隆不显示 | 克隆子对象在 Group 里被隐藏 | 检查 Group Tag |
| 2 | 克隆不在表面 | 分布模式选错 | 用 Object 模式 + 表面对象 |
| 3 | 克隆穿透 | Effectors Scale = -1 | 避免负数缩放 |
| 4 | 渲染时克隆位置不同 | Matrix 没挂 Cache | 加 MoGraph Cache |
| 5 | 克隆材质不随机 | MultiShader 没启用 | 检查 By Index |
动画问题
| # | 现象 | 原因 | 解决 |
|---|---|---|---|
| 6 | 动画不播 | 帧范围设错 | 检查 Project > Frame Range |
| 7 | 动画变卡 | 实时 Shader 复杂 | 烘焙 Cache |
| 8 | 错位动画失败 | Effectors 顺序错 | 用 Mixer 重组 |
| 9 | 弹性动画抖动 | Delay 强度过高 | 降低到 30-50% |
| 10 | 循环不接缝 | 起始/结束帧不同 | 用 Ping Pong 模式 |
性能问题
| # | 现象 | 原因 | 解决 |
|---|---|---|---|
| 11 | 文件超大 | Alembic 精度高 | GZip + 半精度 |
| 12 | 启动极慢 | 缓存全加载 | On Demand 模式 |
| 13 | 内存爆掉 | 物理 Cache 在内存 | 切到 Disk Cache |
| 14 | 烘焙失败 | 缓存写权限 | 改用户文件夹 |
| 15 | Team Render 卡 | 缓存未共享 | 用 Asset Inspector 同步 |
协作问题
| # | 现象 | 原因 | 解决 |
|---|---|---|---|
| 16 | 贴图丢失 | 路径用绝对路径 | 用相对路径 + tex 文件夹 |
| 17 | 字体不显示 | 系统未装字体 | 嵌入字体或转 OBJ |
| 18 | 版本不兼容 | 高版本特性 | 用 Save Version 命令 |
| 19 | 表达式报错 | 变量重命名 | 检查 id 拼写 |
| 20 | Python 脚本失败 | 模块路径错 | 文档中加 sys.path |
九、调试技巧
5 个调试必杀技
1. 启用 FPS 显示
- 菜单:
Window > FPS→ 实时看帧率
2. 单独显示克隆
- 选中 Cloner 按
O→ 只显示克隆,隐藏其他对象
3. Step 效果器离散化
- 给任意效果器加
Step (Dots)→ 调试时更容易看清状态
4. Override 显示
- 在 Effectors 列表上右键
Override→ 临时禁用某个效果器
5. Graph 视图查动画
- 菜单:
Window > Time Track→ 检查关键帧曲线
十、性能优化 Checklist(提交前必查)
视口
- [ ] 克隆器数量 < 50,000
- [ ] 效果器数量 < 10
- [ ] 复杂 Shader 已烘焙
- [ ] Loop Region 启用
渲染
- [ ] 启用 Render Instance
- [ ] 阴影采样 < 16
- [ ] 反射/折射深度 < 4
- [ ] Multi-Pass 关闭(如不需要)
- [ ] 物理模拟已 Bake
文件
- [ ] Alembic 已 GZip
- [ ] 贴图相对路径
- [ ] 缓存单独文件夹
- [ ] 命名规范统一
- [ ] 备份 v001 / v002 / final
附录:性能数字速查
| 操作 | 时间 | 备注 |
|---|---|---|
| 创建 1000 克隆 | < 1s | 标准操作 |
| 创建 100,000 克隆 | 5-15s | Matrix 模式 |
| 烘焙 1000 克隆 × 250 帧 | 30-60s | 简单效果器 |
| 烘焙 100,000 克隆 × 250 帧 | 10-30 min | 复杂 Shader 慎用 |
| 单帧渲染 (1k 实例) | 5-30s | 看材质复杂度 |
| 单帧渲染 (100k 实例) | 5-15 min | 必须用 Instance |
本手册完。如果发现需要补充的内容,欢迎提交 PR 到 GitHub 仓库。