动画压缩与内存

自动关联目录:动画压缩与内存

1. 定位

动画数据通常是角色类项目里最大的资产之一。一段几秒的动画含每根骨骼每帧的变换,未压缩时体积惊人。

一句话定位:动画压缩是用"可控的误差"换"内存、包体与带宽",而误差的容忍度取决于这段动画会不会被近距离、高精度地看到。

2. 压缩做了什么

手段说明
关键帧剔除移除对结果影响小于阈值的帧
量化降低旋转/平移/缩放的存储精度
按骨骼设误差容忍重要骨骼(根、手持物)精度高,末梢(手指)可以糙
曲线压缩动画曲线的单独压缩
位级打包压缩后的位流打包

3. 误差容忍怎么设

骨骼/用途建议
根骨骼(Root)误差容忍极低——根动一点,整个人就位移
骨盆、脊柱低
四肢中
手指、面部可放宽
持握点 / 武器挂点必须低——否则武器会飘
过场动画(近距离)比战斗动画低

最常见的压缩事故:统一设了一个较大的误差容忍,结果武器挂在手上会飘、脚会滑。解决办法就是按骨骼分级。

4. 内存与解压

维度说明
常驻内存解压后的动画数据;同屏角色多时很可观
解压 CPU压缩率越高,解压越贵
流式动画可按需加载(见 资源加载)
共享共享骨架的动画在内存里只有一份数据

关键认知:内存占用取决于同时使用的动画种类数 × 解压后大小,不是角色数量本身(角色共享同一份数据)。

5. 相关设置

设置作用
Skeletal Mesh / Animation 的 Compression Settings选择压缩方案
每个动画的 Compression Error Tolerance 分组按骨骼设容忍度
批量重压缩编辑器里可批量应用
Animation Compression Library (ACL) 插件更高质量的压缩方案(若项目启用)
曲线压缩设置单独配置

具体可选的压缩方案随版本与插件不同,以目标版本为准。

6. 代价与权衡

选择收益代价什么时候不该用
高压缩率内存、包体、带宽省解压 CPU 上升 + 视觉误差过场动画、近距离特写不该用
低误差精度高内存与包体大远处 NPC 不需要
按骨骼分级精度与体积兼顾配置工作量值得做,尤其是有持握物的角色
统一容忍度省事武器飘、脚滑的根源不应作为最终配置
流式加载动画常驻内存低首次播放有加载延迟战斗动作不该流式

7. 踩坑与排查

坑现象怎么验证
统一设了大误差武器飘、脚滑、手穿模按骨骼分级;持握点设低
根骨骼误差大角色整体漂移根骨骼容忍度设极低
过场动画被压缩特写能看到抖动过场动画用低误差档
内存高动画种类多且未压缩批量重压缩 + 流式
解压卡顿首播某段动画时掉帧预加载或降低压缩率
批量重压缩后全变了视觉回归重压缩要过一遍视觉验收
打包后动画不对Cook 时的压缩设置不同检查平台相关设置
曲线被压没了依赖曲线的逻辑失效单独调曲线压缩

8. 排查顺序

1. 视觉误差?→ 定位是哪些骨骼 → 按骨骼调低容忍度
   └─ 优先检查:根骨骼、持握点、脚
2. 内存高?→ 批量重压缩 + 流式 + 减少同时使用的种类
3. 首播卡顿?→ 预加载
4. 批量改动后?→ 必须做视觉回归

参考