一,背景

最近发现项目的动画文件有点大,不光内存大,而且文件也很大,所以从这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是怎么来的,哪位大神知道麻烦告知一下,多谢。

Unity骨骼动画资源解析与优化的更多相关文章

  1. cocos2dx 2.x 骨骼动画优化

    本文原链接:http://www.cnblogs.com/zouzf/p/4450861.html 公司用的骨骼动画的版本貌似还停留在2.1之前的年代而已没有更新,该因各种历史原因吧,而有个大项目“一 ...

  2. Cocos2d-js 开发记录:骨骼动画载入

    不得不说cocos2d-js的文档实在是少,骨骼动画的载入和C++版本的好像还有些不同不能直接依样画葫芦. 一个由cocos studio编辑生成的骨骼动画一般会包含如下几个文件: .ExportJs ...

  3. 骨骼动画的原理及在Unity中的使用

    制作骨骼动画 我们看看这几步操作后,我们得到了那些数据: 1.每个皮肤顶点的初始世界坐标. 2.每个骨骼关节顶点的初始世界坐标. 3.每个顶点被骨骼顶点的影响信息. 4.骨骼如何移动. 骨骼动画原理 ...

  4. Skeleton with Assimp 骨骼动画解析

    Skeleton with Assimp 骨骼动画解析 骨骼动画是图形学中十分常见应用很广泛的一个技术,也是比较基础的内容,作为图形学的工程师需要将这一部分内容梳理清晰,主要关键在于几点:第一,分清楚 ...

  5. 记录 Spine骨骼动画导入unity 步骤[unity3d 4.6.6版本 2d动画]

    1:准备好unity使用Spine所需要的运行库,可到如下地址 https://github.com/EsotericSoftware/spine-runtimes/tree/master/spine ...

  6. Unity即将内置骨骼动画插件Anima2D

    Unity一直在寻找新的方法来帮助开发者,并为他们提供最好的工具.在此我们向大家宣布,Unity将内置流行的骨骼动画插件Anima2D,从2017年1月开始免费供所有Unity开发者使用! 同时也欢迎 ...

  7. 尝试优化骨骼动画计算的意外收获——使用嵌入式汇编对float转int进行优化

    本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4984530.html 公司引擎目前是使用CPU计算骨骼动画(采用了D3DX提供的函数 ...

  8. Unity 2D骨骼动画2:创建真实动画

    http://bbs.9ria.com/thread-401781-1-1.html 在这个系列,我们将关注Unity引擎提供的基于骨骼动画工具.它的主要思想是为了把它应用到你自己的游戏来介绍和教基本 ...

  9. Spine学习七 - spine动画资源+ Unity Mecanim动画系统

    前面已经讲过 Spine自己动画状态机的动画融合,但是万一有哥们就是想要使用Unity的动画系统,那有没有办法呢?答案是肯定的,接下来,就说说如何实现: 1. 在project面板找打你导入的Spin ...

随机推荐

  1. Spark基本架构及原理

    Hadoop 和 Spark 的关系 Spark 运算比 Hadoop 的 MapReduce 框架快的原因是因为 Hadoop 在一次 MapReduce 运算之后,会将数据的运算结果从内存写入到磁 ...

  2. mybatis generator 为数据库保留字段 转义

    为order 添加转义符号“ ` ” `order` <property name="autoDelimitKeywords" value="true"& ...

  3. 当我们用自定义的类对象作为key时,我们必须在程序中覆盖HashCode()和equals()。

    Key值既然可以作为对象,那么也可以用一个自定义的类.比如: m.put(new sutdent(“Liucy”,30),”boss”) 如果没有语句来判定Student类对象是否相同,则会全部打印出 ...

  4. 使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务

    在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Ap ...

  5. 浅从System.Web.Http.Owin的HttpMessageHandlerAdapter看适配器模式

    本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws 一.写在前面 适配器模式(Adapter) 可用来在现有接口和不兼容的类之间进行适配.有助于 ...

  6. win10下Redis安装

    环境:win64 1.因为Redis官方不支持Windows,所在只能在GitHub上下载,下载地址:https://github.com/ServiceStack/redis-windows/blo ...

  7. Springboot的常规属性配置和类型安全配置

    1.类型常规配置: 通过在properties文件中注入键值对的方式,在java代码中通过@Value注解注入值 2.类型安全配置 将要注入的属性包装成一个类,给类加上注解:ConfigrationP ...

  8. python全栈开发 * 11知识点汇总 * 1806011

    一.函数名的运⽤, 第⼀类对象 函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量 1. 函数名的内存地址def func(fn): print(fn)print(func) # ...

  9. PrimeNG之TreeTable

    --treetable用于显示分层数据表格的格式 Import import {TreeTableModule,TreeNode,SharedModule} from 'primeng/primeng ...

  10. Python_tkinter(1)_窗口创建与布局

    环境:Python 3.7.2 1. 窗口基本创建(窗口标题.窗口大小) import tkinter from tkinter import * # 初始化Tk() root = Tk() # 设置 ...