一:为什么要做动画优化
动画文件在游戏包体和内存中占的比例仅次于贴图,优化好动画文件,就优化了一小半游戏内存。拿我们正在开发的游戏举例,优化后的包体和内存比优化前减少了一百多兆,大概优化掉了五分之一的内存。
二:优化思路
2.1:Unity引擎对导入的AnimationClip提供三种压缩格式,Off、Keyframe Reduction和Optimal。其中,Off表示不采用压缩处理;Keyframe Reduction表示使用关键帧进行处理,Optimal则表示Unity引擎会根据动画曲线的特点来自动选择一个最优的压缩方式,可能是关键帧压缩,也可能是Dense压缩;设置Animation.Compression:Animation.Compression默认选择的是Optimal。
2.2:AnimationPositionError默认0.2,AnimationRotationError默认0.1,AnimationScaleError大部分需要丢弃,所以默认就可以。具体值需要根据自己游戏调整,我们游戏由于战斗需要拉近镜头所以对动画精度要求较高,调的压缩值比较小。设置fbx动画导入格式,默认AnimationPositionError = 0.2,AnimationRotationError = 0.1,根据项目调整,表示应该减少多少相关曲线,值越低精度越高。
2.3:默认不开启Resample Curves选项:Unity官方给的建议是开启,但是开启会增大内存,所以在动画没有问题的情况下建议关闭该选项。
三:对AnimationClip资源的压缩
动画文件保存的大部分都是关键帧数据,unity中可以看到:
这里包含的信息很多,官方文档有一些介绍:https://docs.unity3d.com/Manual/class-Animator.html
结合文档,先说下曲线,从上面可以看到曲线有Pos,Quaternion,Euler,Scale,Muscles,Generic,PPtr,这里我们可以关注常用的Pos,Quaternion,Scale,代表着位置,旋转,缩放,Curves Total代表上面的所有曲线综合,计算方法:468 =48*3+48*4+44*3,Pos(x,y,z)3条曲线,Quaternion(x,y,z,w)4条曲线,Scale(x,y,z)3曲线。
然后再看看存储格式,Constant,Dense,Stream,Unity3种数据存储方式。
Constant代表基本不变的数据,哪些数据用这个存储方式?很典型的就是scale曲线,基本上都是1,Constant的内存占用很小,基本上只有关键帧值数据,不含有切线数据。
Dense格式存储,采用的是线性插值方式,不含有切线数据,少内存。一般是线性插值的曲线会采用这种方式;
Stream格式存储,采用的是曲线插值方式,含有切线,时间等全部数据,多内存。最高格式的存储,变化多样的曲线采用这种方式;
上面3种方式Unity会根据关键帧的数据情况来选择存储方式,基本原则就是增加Constant数据,减少Stream数据。