Unity3D手游《仙劍奇俠傳3D回合》性能精講

今天我們為大家帶來由北京蓋婭互娛研發的《仙劍奇俠傳3D回合》 的UWA測評分析。這是一款我們深度優化的3D手游,其在中低端設備上的性能表現非常優異。在此,我們對該遊戲的性能數據進行深度剖析,希望大家對手游各個模塊的運行效率有更為深刻的理解。

該遊戲目前已經正式上線,感興趣的朋友可以通過 仙劍奇俠傳3D回合官網 一睹為快,同時也將於近期正式登陸iOS平台!

CPU性能

該遊戲在CPU佔用方面的性能非常不錯,下圖為該遊戲在紅米Note2設備上按照劇情進行遊戲時的性能數據。可以看出,在紅米Note2上運行的25177幀中,超過33ms的幀數佔比為9.0%,超過50ms的幀數佔比為3.1%。考慮到切換場景時資源載入的開銷,一款遊戲如果超過33ms的幀數佔比低於10%,則說明該遊戲的性能非常出色,絕大部分時刻運行也會非常流暢。

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

1. 渲染模塊

通過UWA性能測評報告,我們可以看到該遊戲詳盡的渲染模塊性能開銷。該遊戲在紅米Note2設備上運行時的渲染模塊CPU開銷如下圖所示。通過統計,半透明物體渲染的CPU消耗均值為 3.4 ms,主要集中在 1.0~7.4ms 範圍內(5%~95%)。不透明物體渲染的CPU消耗均值為 2.8 ms,主要集中在 1.1~6.4ms範圍內(5%~95%)。Draw Call峰值為 791,且主要集中在 48~254 範圍內(5%~95%)。

需要說明的是,Draw Call峰值 和 Triangle峰值 並不是判斷項目存在渲染性能問題的唯一標準。建議開發團隊將峰值和主要範圍(5%~95%)結合起來進行判斷。

Draw Call使用略高,從圖中可以看出,Draw Call峰值出現在場景切換處,然後迅速降低到200左右,這是因為場景的資源在動態載入後通過StaticBatchingUtility API來手動進行合併。這是一個較為好用的降低Draw Call的方法,特別適用於對於動態載入資源、靈活拼合Mesh的項目需求。

在遊戲運行過程中,我們也會偶爾看到Draw Call達到400以上,通過定位,這些Draw Call的升高均是因為劇情需要,或平視鏡頭進行NPC對話,或「御劍飛行」從更高的角度來俯瞰場景。對於這種情況,我們建議可以通過Culling Distance去除一些場景中的小物件(花草)或者較為耗時的物件(粒子特效)等,從而來降低因渲染場景變大而帶來的額外開銷。

2. 物理模塊

在UWA測評報告中,該遊戲運行時的物理模塊CPU開銷如下圖所示。可以看出,Physics.Simulate的CPU佔用主要集中在1ms以下,該值處於合理範圍之內(一般建議在3ms以下)。

該模塊的優秀效率取決於項目對碰撞對Contacts數量的控制,從下圖可以看出,在遊戲運行過程中,Contacts數量的峰值僅為1。同時,Active Rigidbody的數量峰值為1,碰撞體的數量峰值低於40,均處於合理範圍之內。對此,建議大家時刻關注UWA測評報告中Contacts數量、Rigidbody和碰撞體數量的變化,通過對應的項目截圖來判定數量高值處是否合理。

3. 動畫模塊

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

重要提示:動畫模塊的優化主要有以下幾點需要注意

1. 對蒙皮網格在儘可能保證視覺效果的前提下進行簡化,可以通過SimpleLOD等插件來快速查看簡化效果;

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

3. 控制場景中具有Animator Controller組件的GameObject,建議通過調整其Culling選項來降低視域體或一定範圍外的動畫組件更新。

4. UI模塊

該遊戲在紅米Note2設備上運行時的UI模塊CPU開銷如下圖所示。該遊戲使用UGUI作為UI界面的解決方案。經過統計,UI模塊總體的CPU佔用均值為1.1 ms,主要集中在0.1~3.2ms範圍內(5%~95%)。

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

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

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

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

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

內存模塊

《仙劍奇俠傳3D回合》在內存上的表現如下圖所示。總內存峰值達到241MB,Mono堆內存峰值為36.3MB,且內存在遊戲運行過程中表現較為平穩。241MB的總內存分配相對來說略高,研發團隊可嘗試在低端機器上對資源進行進一步控制,從而降低低端機器上的內存佔用。

1. Mono堆內存

從上圖可知,該遊戲的總體Mono堆內存控制得很好,在29075幀中,Mono的堆內存峰值僅為 36.3MB。該值屬於合理範圍之內(<40MB)。同時,該遊戲運行時觸發GC的頻率很低,為968幀/次。

如此低頻的GC觸發和少量的Mono堆內存分配,主要得益於項目的函數堆內存分配控制得非常少,下圖為當前遊戲運行25000+幀的函數堆內存分配情況。因此,建議大家對函數代碼堆內存的分配進行嚴格控制,對於堆內存分配較高(10000幀10MB+)的函數進行詳細定位其分配原因。在UWA測評報告中,我們也提供了堆內存分配Top10的具體堆棧,以方便大家儘快地定位堆內存分配出處。

2. 資源內存

經過統計,該遊戲的紋理資源數量峰值為343個,內存佔用峰值40.4MB。在全部紋理資源中,ETC1格式紋理佔有179個,Alpha8格式紋理佔有133個,RGBA32、ARGB32和RGB24格式紋理共佔有20個,ETC2格式紋理有2個,其餘為RGBA16格式紋理。

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

其他資源的內存佔用情況如下:

Mesh資源:

AnimationClip資源:

AudioClip資源:

目前,該遊戲運行過程中仍然能檢測到少量的「疑似」冗餘資源。下圖分別為紋理資源、動畫資源和Shader資源的冗餘情況。就我們目前深度優化過的項目來看,資源冗餘往往是AssetBundle的冗餘打包所致。對此,如果你的項目也在使用AssetBundle來載入資源,建議將AssetBundle文件提交到 UWA資源檢測工具中,可以快速定位和修復AssetBundle文件中資源的冗餘問題。

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

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


推薦閱讀:

#每天一個小目標#Unity技術分享(三)
『來做一個簡單的無限跑酷遊戲吧』Clickteam Fusion系列教程(12)
#每天一個小目標#Unity技術分享(八)
剛入職unity開發擔心完不成需求,怎麼辦?

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