zoukankan      html  css  js  c++  java
  • Unity骨骼动画资源解析与优化

    一,背景

    最近发现项目的动画文件有点大,不光内存大,而且文件也很大,所以从这2个方面下手处理

    二,动画文件大小优化

    为了优化动画文件大小,我们可以先分析下文件,Ctrl+D将动画文件从FBX拷贝出来,文本打开,如下图:

    可以发现,动画文件基本上都是关键帧数据,分析后我们可以有以下的优化方法。

    1,减少骨骼:

    我们知道一个骨骼是有pos(x,y,z),rotation(x,y,z,w),scale(x,y,z)3个纬度,一共会有3+4+3=10个曲线,少一根骨骼数据,就会少很多的关键帧数据,这会直接导致原始的数据减少。这里的优化方法是美术导出的时候,可以将不受影响的骨骼隐藏,然后输出。

    这个优化会同时减少FBX以及anim文件大小。

    对比数据暂缺=_=

    2,裁剪不需要的曲线:

    通过上面的操作,一些不用的骨骼数据已经不存在了,但骨骼的某些曲线在整个文件都是不会变化的,这样的曲线也是可以删减的,例如scale,基本上不会有变化,这个时候可以将这类型的曲线也删除掉。这里也是需要具体的问题具体分析,如果动画确实有scale变化,就不能删除了。这里的优化FBX文件大小是没有变化的,anim文件会变小,可以参考:

    http://answers.unity3d.com/questions/668672/removing-scale-curves-from-animation.html

    3,存储精度降低:

    从文件我们可以看到,unity存储的精度都比较高,其实用不了那么高的精度,这里可以将精度降低,具体的做法以及数据,可以参考:

    Unity骨骼动画压缩算法

    通过测试发现,精度降低优化效果很明显,裁剪曲线可以不用做了。

    三,动画文件内存优化

    从前面分析可以知道,动画文件保存的大部分都是关键帧数据,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数据。
    根据上面的原则,我们有以下的优化方法:

    1,存储精度降低:

    这个方法不仅会减少文件大小,而且还会减少内存。精度降低了,数据存储就会转变成Constant方式。对比看下压缩的效果,内存少了很多,基本减少50%的内存

    精度降低:

    原始数据:已经压缩了

    2,压缩关键帧:

    通过前面的方法我们已经可以将曲线优化到最少了,但关键帧数据还有很多冗余,比如一个曲线关键帧数据都没有变化,这个时候其实是不需要这么多帧的,只需要2帧,一个开始帧,一个结束帧就可以了,其他的帧可以通过计算获得。

    不压缩内存:

    压缩:unity导入压缩 Keyframe Reduction

    Rotation Error: 0.15

    Position Error:0.15

    Scale Error: 1

    内存从0.6MB 减少到 204.2KB 比例 66%

    分析原因:Constant增加了(19.4%->65.6%),Stream减少了(80.6%->34.4%)

    3,压缩关键帧+存储精度降低:

    通过前面的数据可以看到,2个方式一起处理,效果更好,由0.6MB->204.2KB->100KB,最终的减少内存比例为:83.3%

    四,其他

    动画文件的内存占用,可以在profiler中查看,但建议真机查看,编辑器环境会测试数据不准确。

    这里是会显示一个内存大小的:9.8KB,如果你在编辑器看的话,是会比这个数值大很多,在真机上也会大一些,我们看下真机的测试情况:

    附上真机调试方法:

    http://km.oa.com/group/1746/articles/show/211058?kmref=search&from_page=1&no=4

    我们这里测试几种情况:

    1,2种不同的压缩比例

    2,精度降低+压缩

    从数据可以看到,真机的数据都比编辑器显示的多3.6K,具体这3.6K是怎么来的,哪位大神知道麻烦告知一下,多谢。

  • 相关阅读:
    自定义Listview
    android ListView嵌套GridView显示不全问题
    Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
    android service被系统回收的解决方法
    android Activity基类通用方法
    用 FragmentManager 替换时使用 GoogleMaps 崩溃 app
    Gulp 从0开始
    面试题 之 全排列
    面试题之 query转为obj
    this .运算符 和 [] 运算符
  • 原文地址:https://www.cnblogs.com/damowang/p/6796912.html
Copyright © 2011-2022 走看看