动画压缩与内存
自动关联目录:动画压缩与内存
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. 批量改动后?→ 必须做视觉回归参考
许可协议:CC BY
作者:Davids
本文链接:https://hustjjd.github.io/921b465b.html
更新于:2026年10月10日