动画性能
自动关联目录:动画性能
1. 定位
动画的成本在两个地方:CPU 侧求值(AnimGraph + IK)与内存侧(动画数据的解压与驻留)。大世界里,同屏角色数一多,这两项都会先于渲染成为瓶颈。
一句话定位:动画优化的第一刀是"减少需要完整更新的角色",第二刀才是"简化单个角色的图"。
2. 三层优化
① 更新频率:URO(Update Rate Optimization)——不是每个角色都每帧更新
② 求值成本:AnimGraph 简化、LOD、骨骼 LOD、IK 开关
③ 内存与解压:动画压缩、流式、共享3. URO(更新率优化)
URO 让远处的、不重要的角色降低动画更新频率(如每 3 帧更新一次,中间帧复用上一次的结果或做插值)。
| 相关 | 说明 |
|---|---|
EnableUpdateRateOptimizations(Skeletal Mesh Component) | 开启 URO |
AnimUpdateRateTick | 相关 CVar 分组 |
a.URO.* | URO 的各类参数 |
bEnableUpdateRateOptimizations | 组件上也可设 |
启用 URO 是同屏大量角色时收益最大的一档,且视觉代价通常很小。
4. Animation Budget Allocator
UE 的 Animation Budget Allocator 插件:给整体动画预算设上限,动态分配每个角色的更新率,保证总耗时不超预算。
| 要点 | 说明 |
|---|---|
| 适用 | 大量 NPC / 群体场景 |
| 机制 | 按"重要性"(屏幕占比、距离)分配更新率 |
| 代价 | 远处角色动画精度下降 |
它比手工配 URO 更省心,代价是需要调参与验证视觉。
5. 骨骼 LOD 与动画 LOD
| 机制 | 作用 |
|---|---|
| 骨骼 LOD(Skeleton LOD) | 远处减少参与解算的骨骼数 |
| 动画 LOD | 按距离切换到更简单的 AnimBP/图 |
| 网格 LOD 联动 | 网格 LOD 下降时同步降动画精度 |
骨骼 LOD 对 IK 与 Transform Bone 节点收益明显——骨骼少了,遍历就少了。
6. 并行与多线程
| 机制 | 说明 |
|---|---|
| 多线程动画更新 | 更新与求值放到工作线程(见 AnimBP) |
| 并行求值 | a.ParallelAnimEvaluation 一类开关 |
| 退化的代价 | 一旦在线程安全函数里访问 UObject,整条链退化到游戏线程 |
最大的隐性陷阱:以为开了多线程,实际上因为某处 Cast 而退化——用 stat anim 与 Insights 确认。
7. 参数与控制台变量
| CVar / 设置 | 作用 |
|---|---|
stat anim | 动画耗时统计(第一步) |
showdebug animation | 显示当前 AnimBP 状态与 URO 情况 |
a.URO.Enable / a.URO.* | URO 参数 |
a.ParallelAnimEvaluation | 并行求值 |
a.ParallelUpdate | 并行更新 |
| Animation Budget Allocator 插件设置 | 预算分配 |
Skeletal Mesh 的 bEnableUpdateRateOptimizations | 组件级 URO |
| 骨骼 LOD 设置 | Skeletal Mesh 资产里配置 |
8. 代价与权衡
| 手段 | 收益 | 代价 | 什么时候不该用 |
|---|---|---|---|
| URO | 收益最大 | 远处动画不连贯 | 主角、近处角色不该降 |
| Budget Allocator | 自动控总预算 | 需要调参 | 角色数少的场景不必 |
| 骨骼 LOD | 减少解算量 | 远处骨骼精度下降 | 需要精确 IK 的近处角色不适用 |
| 动画 LOD | 简化图 | 要维护多套 | 简单角色不必 |
| 动画压缩 | 省内存与带宽 | 解压 CPU + 误差 | 见 动画压缩与内存 |
| 共享动画(动画库/实例化) | 省内存 | 复杂度 | — |
9. 踩坑与排查
| 坑 | 现象 | 怎么验证 |
|---|---|---|
| 没开 URO | 大量 NPC 时动画耗时高 | stat anim 看更新数量 |
| 以为多线程实际退化 | 动画占游戏线程 | 检查线程安全函数里是否访问 UObject |
| 骨骼 LOD 没生效 | 远处依然全骨骼解算 | 检查骨骼 LOD 配置 |
| IK 全角色全时开 | 求值慢 | 远处/非必要应关(见 IK) |
| AnimGraph 重复求值 | 慢 | Cache Pose(见 AnimGraph) |
| 主角也被降频 | 主角动画不连贯 | URO/Budget 应排除主角 |
| 动画数据太大 | 内存高 | 见 动画压缩与内存 |
| 只测了一个角色 | 上线后群体卡顿 | 必须压测同屏角色数 |
10. 排查顺序
1. stat anim → 更新耗时 vs 求值耗时
2. 角色多?→ URO / Animation Budget Allocator
3. 单角色慢?→ AnimGraph 复杂度、IK、Transform Bone
4. 占游戏线程?→ 是否退化(线程安全约束)
5. 内存高?→ 动画压缩与骨骼 LOD
6. 一定要压测:同屏 N 个角色,而不是只测一个参考
- AnimInstance 与动画蓝图 · AnimGraph 与节点
- IK 与重定向 · Montage 与 AnimNotify
Profile分支的 CPU 剖析
许可协议:CC BY
作者:Davids
本文链接:https://hustjjd.github.io/ca21ba9a.html
更新于:2026年10月10日