Unity骨骼动画压缩算法

发表于2016-01-12
评论26 1.42w浏览

Unity骨骼动画压缩算法

算法简介:

35行代码,帮你减少50%的动画文件大小!


该算法会将UnityAnimation文件的存储精度降低,从而达到压缩的目的。不过可以放心,该方法几乎是无损压缩。详细后面会有介绍。如果有部分动画文件因为压缩导致肉眼可以看出区别,可以对该文件单独处理,提高压缩精度或者不压缩。以我们项目为例,500多个动画,只有一个动画损失肉眼可辨。粗略测试得出结论,可以压缩骨骼动画文件50%的大小。

原理介绍:

该算法实际上只做了一件事,将存储骨骼位置信息的浮点数的精度降低,从而减少大量的近似为0的用科学计数法表示的数据。这些数据虽然都小到对动画效果毫无影响,但实际值又不一样,Unity在打包的时候为了保持其精度,不能压缩这类数据。处理前后的结果如下图所示。

快速上手:

:将ToolAnimationCompress.cs脚本放到Editor目录,如图:
 

二:选择你要压缩的动画,或者选中所在文件夹。如图:

三:点击CompressClip。如图:

四:控制台输出如下,表示压缩成功。
 

五:该工具也支持压缩FBX骨骼动画。如下图,选中待压缩的FBX动画文件。

六:点击CompressFBX开始压缩。

输出如下图表示压缩完成:

(注意,目前对3DMax导出的FBX动画文件支持完美,Maya导出的FBX文件有问题。因为格式不太一样,后续支持)

其他说明:

对动画文件做压缩,主要有以下几个方面:

1.减少关键数量。(Unity自身属性设置可以完成)

2.通道省略。(比如旋转通道,平移通道,缩放通道都可以选择性的删除。)

3.曲线差值退化。(一些匀速变化的通道,可以删除曲线插值相关的数据)

4.骨骼剔除。(比如手指骨骼数据,在多数动作下都是可以删除的)

5.精度压缩。(将小数点保留到后3位,而不是Unity自身的10位。)

 

以上各方法都可以取得一定的成效,比如骨骼剔除和通道省略在某些地方都可以

取得不错的效果(10%30的压缩比),但操作成本较高,性价比低。所以该工具

最终只做了一件事——精度压缩。后面的测试也表明,仅此一项就能达到50%左右的

压缩比,并且此时再做其他操作(如通道删除)效果非常微弱。感兴趣的同学可以

自行分析和测试

 

PS 建议分批压缩,逐模块压缩,及时测试看效果,可以及早的发现不合适的动画。

不建议几百个动画起压。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引