動畫優化:關於 AnimationClip 的三兩事
在上一期《材質優化:如何正確處理紋理和材質的關係》中,我們針對“材質”在日常開發過程中會遇到的一些注意點和大家進行了分享。這些看似細小的知識點,很容易在大家的開發和學習過程中被疏忽掉,而長期的問題積累最終都會反映到專案的效能表現上。為此,我們將這些規則列出,並且以一個個知識點的形式向大家逐一解讀。
在本文中,我們將面向“動畫”這個方向,以UWA本地資源檢測中的檢測規則:“Compression != Optimal的動畫資源”和“AnimationState數量過高的AnimatorController”,來為大家簡單講解相關的知識點。我們將力圖以淺顯易懂的表達,讓職場萌新或優化萌新深入理解。
1、Compression != Optimal的動畫資源
在專案的實際執行中,AnimationClip資源是執行時載入頻率最高的資源之一。通俗地講,它包含了Unity動畫執行中所涉及的大量的例如骨骼關節位置,放大縮小,旋轉變換,時間關係等各類資訊,並以動畫曲線的方式進行儲存。
AnimationClip的壓縮格式決定了其包體大小、執行時佔用記憶體大小以及載入效率。目前,Unity針對AnimationClip提供三種壓縮格式:
Off——以Stream方式儲存動畫資料,但不做壓縮處理;
Keyframe Reduction——以Stream格式儲存動畫資料;壓縮方式上,使用關鍵幀縮減演算法(簡單來講,就是對去除關鍵幀前後的曲線進行比較,如果對應的曲線值的差小於容錯值/誤差寬容度,則去掉關鍵幀)
Optimal——Unity會使用啟發式演算法,從而決定使用Keyframe Reduction演算法進行壓縮(Stream格式儲存),或者使用Dense格式壓縮儲存動畫曲線。
針對這三種壓縮方式,基於我們曾經做對比試驗時的實際表現(詳情可參考:《Unity載入模組深度解析之動畫資源》),可以發現在載入耗時上,Optimal是三種方式內最有優勢的。
Off這個選項是Unity官方都不推薦的,這裡就不細說了。Keyframe Reduction的壓縮方法,是採用Stream格式儲存。動畫曲線包含時間和切線資訊,進行曲線插值。記憶體佔用會比Dense格式儲存稍大,在記憶體壓縮效果上不是最優選擇。
一個簡單的Stream曲線示意圖
而Optimal在壓縮方法上,會從Stream格式和Dense格式之間進行選擇。主要的差別是Dense格式不含有切線資料,所以記憶體佔用會更小。
一個簡單的Dense曲線示意圖
由此可見:Optimal壓縮方法雖然可能會造成動畫質量稍有降低的問題,但記憶體佔用是最低的,所以是我們最推薦的方案。
因此,在“優化”這個前提下,本條規則會找出所有不為Optimal的動畫資源,並且詳細標註出相應的壓縮型別;開發團隊需要依據記憶體效能和動畫效果的實際考量,去對這部分資源進行單獨的設定。
2、AnimationState數量過高的AnimatorController
首先我們先簡單理解一下Animation和Animator。這倆是Unity中兩套用來控制動畫播放的元件。Animation的存在時間更早,從使用上來講適合控制單個動畫資源。
Animator的出現時間較晚,但在控制多個動畫資源以及動畫資源間的切換上具有優勢。
然後我們再來說一下AnimationClip和AnimationState。AnimationClip我們在上面一條中簡單說了,它裡面包含了很多資訊,而每一個AnimationClip外都套著一個叫做“AnimationState”的外殼,包含了動畫片段的一些播放控制屬性。
關鍵來了:Animator元件通過“狀態機控制器”,也就是AnimatorController,來控制多個AnimationState,以此實現AnimationClip之間的切換。
比如實現“跑步—原地休息—爬樹—原地休息—跑步”這一連串的動畫動作,我們只需要將這幾個AnimationClip新增到Animator編輯器內即可。
UWA曾經做過相關的測試,結果表明:單個AnimatorController下掛載的AnimationState數量過大,會給CPU運算帶來一定的壓力,在進行開發時候,應該儘量控制AnimatioinState的數量。對此規則,我們給的預設閾值為30。
所以在篩選出這些“動畫狀態機中AnimationState的數量過多”的AnimatorController之後,開發團隊需要根據實際情況去判斷其合理性。
希望以上這些知識點能在實際的開發過程中為大家帶來幫助。需要說明的是,每一項檢測規則的閾值都可以由開發團隊依據自身專案的實際需求去設定合適的閾值範圍,這也是本地資源檢測的一大特點。同時,也歡迎大家來使用UWA推出的本地資源檢測服務,可幫助大家儘早對專案建立科學的美術規範。
我們已支援Luacheck功能啦~
我們已支援粒子特效檢測~
這麼多實用貼心的功能
你們還沒用起來嗎?
萬行程式碼屹立不倒,全靠基礎掌握得好!
效能黑榜相關閱讀
《那些年給效能埋過的坑,你跳了嗎?》
《那些年給效能埋過的坑,你跳了嗎?(第二彈)》
《掌握了這些規則,你已經戰勝了80%的對手!》
相關文章
- 關於webpack優化,你需要知道的事(上篇)Web優化
- 關於mysql的優化MySql優化
- Remote Cube的三兩事REM
- 關於mysql執行效率優化注意事項及要點MySql優化
- 關於分散式事務、兩階段提交協議、三階提交協議分散式協議
- 關於SQL優化的闢謠SQL優化
- 關於sql語句的優化SQL優化
- 關於首屏優化優化
- 推薦“ORACLE關於優化器統計收集”兩本白皮書Oracle優化
- 關於Laravel的二、三事(1)簡單的路由Laravel路由
- 關於SQL優化的小知識SQL優化
- 關於sap效能優化的問題優化
- 關於Swagger優化Swagger優化
- Android中關於Context的三言兩語AndroidContext
- 關於資料視覺化那些事視覺化
- 陪玩原始碼介面效能優化,需要你掌握的關於呼叫的一些事原始碼優化
- 關於Java你不知道的那些事之Java8新特性[HashMap優化]JavaHashMap優化
- 關於vue的webpack打包優化問題VueWeb優化
- 關於Execute to Parse %:比例太低的優化思路優化
- 記MySQL一次關於In的優化MySql優化
- 關於分頁查詢的優化思路優化
- 效能優化之關於畫素管道及優化(二)優化
- Canvas 動畫的效能優化實踐Canvas動畫優化
- 用requestAnimationFrame優化你的javascript動畫requestAnimationFrame優化JavaScript動畫
- 關於Java序列化你不知道的事Java
- 關於Cookie的那些事Cookie
- 優化動畫卡頓:卡頓原因分析及優化方案優化動畫
- 關於迴流與重繪優化的探索優化
- 關於效能優化的一些實踐優化
- 關於C#程式優化的五十種方法C#優化
- 關於資料字典的查詢效率優化優化
- 關於URL優化的一些經驗優化
- [轉]轉一個關於優化sql的文章優化SQL
- 【SQL優化】SQL優化的10點注意事項SQL優化
- 關於Autolayout製作動畫的坑動畫
- app 效能優化的那些事APP優化
- Android中記憶體優化的那些事 - 一個有關圖片的優化記錄Android記憶體優化
- Android中記憶體優化的那些事 – 一個有關圖片的優化記錄Android記憶體優化