Unity3D回合制手游《星辰奇緣》性能測評深度分析

今天我們為大家帶來由廣州詩悅研發的3D回合制策略手游《星辰奇緣》的測評報告分析。這是一款我們深度優化的3D移動遊戲,其在中低端設備上的性能表現非常優異。在此,我們將對該款遊戲的性能數據進行深度剖析,希望通過這篇文章可以讓大家對移動遊戲的運行性能有更為深刻的認知,並對大家的項目研發有所幫助。

這是侑虎科技第60篇原創文章,歡迎轉發分享,未經作者授權請勿轉載。同時如果您有任何獨到的見解或者發現也歡迎聯繫我們,一起探討。(QQ群465082844)

CPU性能

該遊戲在CPU佔用方面的性能非常不錯,下圖為該遊戲在 紅米Note2不停打怪時的性能開銷。可以看出,在紅米Note2上運行的29075幀中,超過33ms的幀數佔比為1.3%,超過50ms的幀數佔比為0.5%。

其整體CPU性能的優秀表現與其各個模塊的合理使用是分不開的。下面,我們就詳細講解一下其CPU性能方面的亮點之處。

1. 渲染模塊

該遊戲在紅米Note2設備上運行時的渲染模塊CPU開銷如下圖所示。通過統計,半透明物體渲染的CPU消耗均值為 5.9 ms,主要集中在 3.1~9.9ms 範圍內(5%~95%)。不透明物體渲染的CPU消耗均值為 2.0 ms,主要集中在 1.4~3.1ms範圍內(5%~95%)。Draw Call峰值為 191,且主要集中在 91~155 範圍內(5%~95%),該值處於合理範圍之內。

從上圖可以看出,遊戲打怪過程中渲染模塊的主要開銷為半透明渲染所佔據。究其原因,其主要是技能特效播放時的粒子特效所致,如下圖所示。

粒子系統是目前大量項目中半透明渲染耗時較高的「罪魁禍首」。如果你的項目半透明渲染較高,一定要重點查一下粒子系統的渲染開銷。一般來說,建議將粒子系統的渲染開銷主體範圍(5%~95%)控制在0~3ms範圍內。

2. 動畫模塊

該遊戲運行時的動畫模塊CPU開銷如下圖所示,目前該項目使用的是Mecanim動畫系統。通過統計,Animator.Update總體的CPU佔用均值為1.3 ms,主要集中在0.8~2.4ms範圍內(5%~95%),該值處於合理範圍之內(一般建議在3ms以下)。MeshSkinning.Update總體的CPU佔用均值為0.8 ms,主要集中在0.4~1.3ms範圍內(5%~95%),該值同樣處於合理範圍之內(一般建議在3ms以下)。

動畫模塊的低效能開銷主要得益於研發團隊對於蒙皮網格的控制。該項目中,角色模型的頂點數均在1300以下,且沒有多餘的頂點屬性,這足以說明該研發團隊在資源製作上嚴格的把控能力。

重要提示:除對蒙皮網格進行控制外,UWA仍強烈建議大家儘可能開啟「Optimize GameObject」這一選項,它將進一步提升項目的動畫模塊效率。

3. UI模塊

該遊戲在紅米Note2設備上運行時的UI模塊CPU開銷如下圖所示。該遊戲的UI模塊效率經優化後已經非常出色,經過統計,UI模塊總體的CPU佔用均值為1.0 ms,主要集中在0.2~3.4ms範圍內(5%~95%),在29000幀+的測試時間內,累積堆內存分配總值僅為1.3MB。

目前,大量項目的UI模塊CPU佔用均很高。我們看到的UI模塊開銷,經常是如下圖一般的高開銷、高佔用。

對於UGUI的性能優化,我們建議你時刻注意以下幾點:

1、儘可能將靜態UI元素和動態UI元素分開,存放於不同的Canvas下。同時,對於不同頻率的動態元素也建議存放於不同的Canvas中;

2、嚴格控制一個非靜態的Canvas(即Canvas中會有元素髮生變化)中的UI元素數量,因為Canvas中所有的UI元素都會合併到一個Mesh中,一旦某個元素髮生變化,則會引起Mesh發生變化,從而造成開銷;

3、儘可能減少Mask組件的使用,不僅提高繪製的開銷,同時會造成Draw Call明顯上升。

4. Shader載入

該遊戲目前在運行過程中幾乎不存在任何Shader解析開銷。下圖為遊戲優化前後Shader載入的耗時對比(上圖為優化前開銷,下圖為優化後開銷)。不難看出,該遊戲在優化前存在較大量的Shader重複載入開銷,而在優化後則僅在開始處載入一次,後續運行則再沒有Shader的載入耗時。對於Shader的載入性能分析及優化方案,我們在剛剛推出的載入模塊之Shader資源中有詳細說明,感興趣的可以進一步閱讀。

內存模塊

《星辰奇緣》在內存上的表現同樣突出,如下圖所示。總內存峰值為128MB,Mono堆內存峰值為23.6MB,且內存在遊戲運行過程中表現平穩。

1. Mono堆內存

從上圖可知,該遊戲的總體Mono堆內存控制得很好,在29075幀中,Mono的堆內存峰值僅為23.6MB。該值屬於合理範圍之內(<40MB)。

該遊戲Mono堆內存分配之所以可以控制得如此之小,主要得益於項目的函數經過了大量的檢測和深度的優化,下圖則為當前遊戲運行29000+幀的函數堆內存分配情況。

2. 資源內存

經過統計,該遊戲的紋理資源數量峰值為393個,內存佔用峰值18.9MB。在全部紋理資源中,ETC1格式紋理佔有199個,RGBA16格式紋理有42個,ARGB32格式資源數共有61個,ETC2格式紋理有22個,其餘為n/a紋理(代碼生成的紋理)。

對於RGBA32、RGBA16和RGB24格式的紋理,我們建議在視覺效果可以保證的情況下,儘可能使用ETC1格式紋理進行替換,不僅可以達到更小的內存佔用,同時可以獲得更快的載入效率。對於紋理資源的載入效率,我們在之前的載入模塊性能文章中進行了詳細的分析和闡述,建議大家進一步查看,進一步加深載入模塊的掌控能力。

3.其他資源的內存佔用情況

Mesh資源:

AnimationClip資源:

AudioClip資源:

以上則為《星辰奇緣》遊戲在CPU性能和內存管理方面的具體使用情況。優秀的CPU性能、較低的內存分配和合理的資源使用,足以說明該研發團隊具備非常深厚的技術功底和對於引擎相當優秀的把控能力。

最後,非常感謝《星辰奇緣》研發團隊對 UWA 的認可和支持。感謝他們樂於將項目性能數據與大家一起分享,讓更多的研發團隊了解到一款性能優秀的3D回合策略遊戲在各個模塊上應該做到怎樣的程度。同時,也希望更多的開發團隊可以與我們一起來分享他們的性能數據,讓更多的遊戲開發者受益!


推薦閱讀:

Unity匿名函數的堆內存優化
一個採用GC的原生程序語言有沒有可能性能上超越非GC的原生程序語言?
寫工業級別代碼是怎樣一種體驗?
一段簡單文件IO的C程序,為什麼我的優化反而更慢?
如何優化QTableView的性能?

TAG:Unity游戏引擎 | 手机游戏开发 | 性能优化 |