Unity Animator卡頓研究
想免費獲取內部獨家PPT資料庫?觀看行業大牛直播?點擊加入騰訊游戲學院游戲程序行業精英群
711501594在某一天,我們發現某個特效資源在使用時會有卡頓,通過Profile發現了下面這個坑
Animator組件在Enable時,需要重建內部數據,導致了異常的卡頓
對於這類問題,我們之前的做法是不用SetActive,而是使用SetLayer到不可見層來避免卡頓。但到底效率如何呢?為了避免同樣的事情發生,針對游戲中常見的幾個組件做了實驗,實驗的組件包括 Animator, Animation, ParticleSystem, MeshRenderer
(下面所有測試都在Meizu MX4 Pro上進行,Unity版本4.7.1)
我們在一個節點下創建了4個類型的gameobject,嵌套了一層同樣的子節點
每幀分別setActive和setLayer(遞歸子節點)100次 結果如下
可以看到結論是,Animator的開關耗時很大,應該盡量避免
接下來嘗試用setlayer解決
創建了50個英雄(用Animator的動作),用SetLayer的方式設置成Hide層(相機不渲染),CullingType是baseOnRender
Animator的Update平均有4-5ms的開銷
這種情況下設置成AlwaysAnimate,曲線變抖了很多,平均有6-7ms開銷
SetActive之后完全沒有Animator.Update了
嘗試去掉這個Update的消耗
試了幾種辦法:嘗試Speed=0沒有效果;嘗試設置成到手動控制模式(StartPlayback),動作能停止但Update的消耗還在。
經過幾次嘗試后發現可以設置Animator的enable,又做了下面的實驗:
首先測試Behaviour.Enable的性能
可以看到消耗比上面幾種情況都要小得多
接下來拿英雄做實驗
50個英雄SetActive=false的開銷還是很明顯的
SetLayer的效率高多了
但Animator.Update的開銷還是很高
enable設置false之后Animator.Update沒了
切換開銷也較小
enable設置成true之后Animator.Update又回來了,切換開銷也很小
故此,終於找一個可以兩全的方法。
結論
對於Animator組件,應該盡量避免使用SetActive,改成SetLayer Behaviour.Enable=false的效率能好很多
建議: Unity的性能優化,實踐很重要。Unity引擎提供API使用很簡單也很給力,但內部的原理往往不得而知。為了減少使用API造成的不良影響,一方面可以通讀代碼,但更重要的是通過實踐和Profiler,總結出更好的做法。