【轉】Unity Animator卡頓研究


Unity Animator卡頓研究

發表於 2017-07-26
 
   評論3    2.3k瀏覽

想免費獲取內部獨家PPT資料庫?觀看行業大牛直播?點擊加入騰訊游戲學院游戲程序行業精英群

711501594
| 導語 資源池化是游戲項目中最常見的一種優化方式,具體做法是當資源不需要使用時,不直接釋放而是回收到池中,等待下一次使用。對於unity游戲而言,回收的方式一般是SetActive,這么做已經回收的存量的資源就不會產生額外的消耗。但因為unity的一些“坑”,導致性能問題,我們需要換一種回收策略,也有了這篇Unity Animator卡頓研究。

在某一天,我們發現某個特效資源在使用時會有卡頓,通過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,總結出更好的做法。


免責聲明!

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



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