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是怎么來的,哪位大神知道麻煩告知一下,多謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM