【转】Unity Animator卡顿研究
【轉】Unity Animator卡頓研究
Unity Animator卡頓研究
發表于2017-07-26 ? ?? 分享 分享到 ?想免費獲取內部獨家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,總結出更好的做法。
posted on 2019-04-30 09:44 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏
總結
以上是生活随笔為你收集整理的【转】Unity Animator卡顿研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不再有神的概念,将所有存在称之为文明,这
- 下一篇: 渲染资料收集