UWA本次釋出的《2023-2024年度Unity手遊效能藍皮書》將彙總遊戲行業使用Unity引擎進行手遊開發過程中及遊戲上線後的效能表現,從測試機型分佈、引擎各模組開銷、記憶體佔用等方面剖析定位Unity手遊效能瓶頸和趨勢,反映了Unity手遊行業的現狀,幫助遊戲開發商尋找合適的效能定位和提升方案。
這是侑虎科技原創文章,歡迎轉發分享,未經官方授權請勿轉載。如果您有任何獨到的見解或者發現也歡迎聯絡我們,一起探討。(QQ群:793972859)
報告目錄:
1)Unity手遊測試機型分佈
2)Unity手遊CPU模組效能開銷分析
3)Unity手遊記憶體模組效能開銷分析
4)Unity手遊GPU模組效能開銷分析
本次釋出我們針對不同檔次的機型進行分檔,分檔的依據為UWA根據裝置的算力。以下是每種檔位的典型機型:
高階機:小米10、小米11、紅米K40、小米9、小米13、小米12、HUAWEI P40、紅米K50、Galaxy S21、HUAWEI P40 Pro、華為Mate 40 Pro
中端機:小米8、OPPO R17、榮耀9X、榮耀V20、華為P30、紅米K30、紅米note8、小米6、小米MIX2
Unity手遊測試機型分佈
在本週期的遊戲研發團隊的測試中,我們統計了專案組在日常研發過程中使用的測試手機品牌和具體型號的佔比,反映出遊戲研發團隊用於效能測試的移動裝置的選擇偏好。
各品牌的使用佔比
遊戲研發團隊用於效能測試的機型主流品牌依次是華為(17%)、小米(15%)、紅米(15%)、Vivo (11%)、三星(10%)和OPPO (10%);由於遊戲出海的需求,三星手機的佔比依然較高,且在出海的地區中三星的佔比遠高於小米和Vivo。
注:由於一個專案可以同時使用多個品牌的裝置進行測試,統計中進行了規範化使佔比總和為100% 。
Top 20 測試裝置(按專案佔比計算)
- 小米品牌以絕對性優勢在測試機型中拔得頭籌,Top 3機型分別為小米10、小米8和小米11;
- 華為品牌的Top 3機型分別是華為P30、華為P40和華為P40 Pro;
- Top 20機型中沒有低端機型。
Top 20 測試裝置使用趨勢(按專案佔比計算)
以小米8、小米10和小米11作為測試機的數量明顯提升;
上一年度的低端機代表紅米 4X已退出Top 20排名。
透過UWA Pipeline完成自動化測試的佔比趨勢
我們發現最近一年來,大家在自動化測試方面有了長足的進步,截止到2024年Q1底,已經有23%的UWA效能測評報告透過自動化測試提交到UWA後臺分析系統。這說明自動化測試在大量專案組裡已經得到了很好地執行和落地,雖然自動化指令碼的編寫和維護依然有一定的門檻,但很多團隊已經找到了突破口,一旦這種體系建立起來,研發的質量和效率都將得到大幅度提高。
FPS均值總體情況
不同檔次裝置的FPS均值表現
從已有的測試資料看,高達44%的專案幀率在20-30幀之間,24%的專案在45-60幀之間。說明大部分的專案還是趨於30幀的目標做最佳化,但同時也說明目前已經有較多專案開始以60幀為目標進行遊戲開發,高階裝置(非頂端)上已經有近25%的專案以60幀作為目標。
在中低端裝置上:73%的專案未到達30幀,26%的專案未達到20幀;
在中端裝置上:62%的專案未達到30幀;
在高階裝置上:50%的專案未達到30幀;
在頂級裝置上:37%的專案未達到30幀,3%的專案達到60幀。
不同檔次裝置的FPS均值走勢
頂級裝置的幀率(均值)在37幀左右;
高階裝置的幀率(均值)在32幀左右;
中端裝置的幀率(均值)在29幀左右;
中低端裝置的幀率(均值)在24幀左右。
Jank均值總體情況
不同檔次裝置的Jank值走勢
卡頓均值在2023年Q3的表現上仰,後續卡頓值維持在11次/分鐘,建議研發團隊多使用UWA GOT Online - Overview模式測試,並透過卡頓分析功能來進行檢測和最佳化。
下面我們來具體分析Unity引擎的主流模組的開銷情況。
為了能夠更好地反映出各個效能引數的整體使用情況,我們統計了每種效能引數的主體使用範圍,其範圍區間是[5%~95%],以下資料中P5代表5%,P50代表中位值,P95代表95%。
Unity手遊CPU模組效能開銷分析
一、渲染模組
DrawCall數量的主體範圍均值
半透明渲染DrawCall主體範圍均值
不透明渲染DrawCall主體範圍均值
DrawCall Batches數量的主體範圍均值
從上述的資料中可以看出,URP專案在透過合理的Batch之後,基本上都控制在了合理範圍內,說明SRP Batch的合批效果非常突出,這也是UWA推薦研發團隊要深入學習URP的原因。
Triangle數量的主體範圍均值
同屏渲染面片數在不同檔次的裝置上畫質分級效果已經並不突出,建議研發團隊進一步加大場景、角色建模的複雜度,將模型的細節更加突出。
二、邏輯程式碼
GC呼叫頻率(幀/次)
僅有32%的專案將GC呼叫頻率控制在1000幀/次以上;51%左右的專案小於600幀/次,說明GC問題依然值得關注。
不同檔次裝置的GC呼叫頻率
對於GC的最佳化,建議研發團隊一方面繼續最佳化自身邏輯程式碼的堆記憶體分配,一方面推薦大家使用Unity引擎的Incremental GC功能,來降低每幀GC的CPU耗時。
三、UI模組
目前我們主要統計了NGUI、UGUI和FGUI的佔比情況。三種UI解決方案在這一年中,總體走勢都較為平穩,UGUI依然是壟斷地位,最高時可達86%;同時,依然有7%左右的使用者在使用NGUI,FGUI的使用比例在7%左右。
UI 型別佔比
UI 型別佔比走勢
接下來,我們以統計範圍內最為主流的UGUI來進一步分析。
UGUI耗時均值分佈
Canvas.SendWillRenderCanvases CPU耗時均值分佈
UI模組的效能開銷依然很高,但相較於去年,確實有進一步提升。這主要是在這一年多以來,各大研發團隊對於UGUI的理解和掌握都在不斷深入。當然,UGUI的使用也會有明顯的效能問題,主要有以下四方面:
- DrawCall;
- 重建;
- Overdraw;
- 主執行緒阻塞。
針對以上問題,大家可以透過UWA學堂(https://edu.uwa4d.com)中UI相關的技術文章和影片進行學習和了解,相信對幫助大家快速提升UI方面的技術理解大有裨益。
四、動畫模組
Animators.Update耗時主體範圍均值
不同檔次裝置Animators.Update耗時均值走勢
除了中低端裝置,其他檔次裝置的動畫效能的趨勢表現都較為平穩,說明大家對於動畫模組的使用較為合理的。除了中端裝置,裝置動畫模組的效能耗時在2023年Q4均有所上漲。
同時,AnimationClipPlayable功能也非常值得研發團隊後續研究和關注,它對於動畫系統效能方面的提升有很大的潛力可以挖掘。
五、物理模組
Physics.Processing耗時均值的主體範圍
物理模組耗時走勢
物理模組的整體耗時相對比較平穩,這得益於越來越多的研發團隊對於物理引擎開啟的必要性做了更深入的瞭解。
同時,隨著大家對於場景和角色物理模擬的逼真度要求越來越高,布料、布娃娃系統相關的外掛開始逐步被廣泛使用。特別是今年我們關注到不少團隊開始使用Magica Cloth並取得了不錯的效能效果,因此建議研發團隊對其進行研究關注。
六、粒子模組
ParticleSystem.Update耗時的主體範圍均值
粒子系統耗時均值走勢
不同檔次裝置粒子系統耗時均值走勢
提示研發團隊注意兩方面:
1)建議針對粒子系統根據不同裝置的效能進行不同程度的調整,從而進一步降低粒子系統的CPU耗時和記憶體佔用;
2)針對技能特效建議進行定期自動化地檢測,可以參考深圳雷霆的特效自動化檢測方案。
Unity手遊記憶體分佈
一、總體記憶體
PSS記憶體佔用峰值總體情況
不同記憶體裝置的PSS記憶體佔用峰值
PSS記憶體佔用峰值走勢
不同記憶體裝置PSS記憶體佔用峰值走勢
4GB記憶體以下裝置的記憶體佔用(中位值)在800MB-1.2GB之間,4GB記憶體以上裝置的記憶體佔用在1.2GB-1.6GB(中位值)之間,且無論是低端、中端還是高階,整體都呈上升趨勢。
二、總體堆記憶體
Mono記憶體佔用峰值總體情況
不同記憶體裝置的Mono記憶體佔用峰值
Mono記憶體佔用峰值走勢
不同記憶體裝置的Mono記憶體佔用峰值走勢
總體堆記憶體一直是專案的記憶體瓶頸,雖然在過去一年有所起伏,整體堆記憶體都高達90MB以上,且超過1/3的專案高達120MB。這主要是遊戲的重度化所致,但另一方面也是研發團隊對於Mono堆記憶體分配疏於管理所致,例如配置檔案的序列化庫使用不當等,建議研發團隊在專案中前期選擇序列化庫時儘可能做更多的調研或者實驗,來制定更合適合於自身專案的序列化配表解決方案。
專案的記憶體佔用很大一部分來自於資源的使用,下面我們將對專案中主流資源的使用情況進行分析。
三、紋理資源記憶體
紋理記憶體佔用峰值總體情況
不同記憶體裝置的紋理記憶體佔用峰值
紋理記憶體佔用峰值走勢
不同記憶體裝置的紋理記憶體佔用峰值走勢
雖然硬體裝置和畫質要求在不斷提升,但大家在高記憶體裝置上的畫質分級的設計上還不夠明顯,效果差異尚未拉開。這說明大量專案在中高階裝置上並未很好地利用裝置的硬體優勢,UWA認為,在當下的高階甚至旗艦裝置上,大家的遊戲品質依然有很大的可提升空間。
ASTC/ETC格式紋理覆蓋率走勢
ASTC/ETC格式紋理執行時數量佔比走勢
使用ASTC格式的專案越來越多,且自身資源的數量在專案中的佔比也在快速升高。就目前我們觀測到的專案而言,在國內,ASTC已經成為目前遊戲市場的主流格式,基本上大家可以直接選擇該格式成為專案紋理的解決方案。而如果考慮出海,則建議研發團隊透過更多當地運營專案或渠道資料來謹慎選擇ASTC或ETC2格式。
四、網格資源記憶體
網格記憶體佔用峰值總體情況
不同記憶體裝置的網格記憶體佔用峰值
網格記憶體佔用峰值走勢
不同記憶體裝置的網格記憶體佔用峰值走勢
網格峰值記憶體的中位數使用記憶體均在30MB以下,該值偏低,由於裝置記憶體在不斷增加,研發團隊可以考慮進一步加大場景、角色建模的複雜度,將模型的細節更加突出。
五、動畫資源記憶體
動畫片段記憶體佔用峰值總體情況
不同記憶體裝置的動畫片段記憶體佔用峰值
動畫片段記憶體佔用峰值走勢
不同記憶體裝置的動畫片段記憶體佔用峰值走勢
動畫模組的記憶體使用趨勢在2023年Q3有明顯的上升,峰值記憶體的均值長期維持在20MB之內。
六、Shader資源記憶體
Shader記憶體佔用峰值總體情況
不同記憶體裝置的Shader記憶體佔用峰值
Shader記憶體佔用峰值走勢
不同記憶體裝置的Shader記憶體佔用峰值走勢
Shader資源記憶體峰值大幅上升的主要原因是不少專案進行了Unity版本的升級,屬於正常現象。Unity 2019.4.21以後,Shader的記憶體統計發生了變化。原來統計在ShaderLab中的記憶體現在也被算在Shader資源本身了。
這裡,UWA仍然需要提醒的是,Standard Shader在大家的專案中被經常誤引入進來,建議大家在UWA效能簡報中的“具體資源使用資訊”中特別關注Standard Shader的使用情況。
同時,也建議研發團隊結合本地資源檢測服務,對Shader相關的規則做檢測,尤其是變體數量。
七、RenderTexture資源記憶體
RenderTexture記憶體佔用峰值總體情況
不同記憶體裝置的RenderTexture記憶體佔用峰值
不同記憶體裝置的RenderTexture記憶體佔用峰值分佈
RenderTexture記憶體佔用峰值走勢
不同檔次裝置的RenderTexture記憶體佔用峰值走勢
不同檔位機型上的RenderTexture記憶體佔用都有波動,且在RT的效果分級上取得了一定的成效。
八、粒子系統資源記憶體
粒子系統記憶體佔用峰值總體情況
不同記憶體裝置的粒子系統記憶體分佈佔用峰值
不同記憶體裝置的粒子系統記憶體分佈佔用峰值
粒子系統記憶體分佈佔用峰值走勢
不同檔次裝置的粒子系統記憶體分佈佔用峰值走勢
粒子系統的使用數量在逐步提升,並保持在10~25MB之間,說明遊戲團隊的特效品質在不斷提升。UWA建議大家在不斷提升特效品質的同時,切記要經常檢測特效的製作質量和效能開銷,因為美術人員如果不瞭解特效的製作特點,很可能會造成“做的越多、返工越多”的現象,這樣就會造成大量的研發資源浪費,甚至導致專案上線的延期。
對此,UWA推出的本地資源檢測服務,針對專案工程中的靜態資源(比如紋理、網格、音訊、動畫以及粒子系統、程式碼設定等等)可做檢測,來檢測美術資源是否有設定不合理,做到靜態資源的及時問題反饋、及時修復。
Unity手遊GPU模組效能開銷分析
GPU重要效能引數
從2023年的Q2開始,我們的GOT Online產品開始陸續推出GPU端的效能分析指標,我們希望透過提供更多有價值的效能指標,來為遊戲專案在GPU方面提供更好的分析和最佳化方案。透過這一年來的摸索,我們在整個行業內積累了大量的GPU端相關效能資料,接下來,我們將針對較為重要的指標來進行分享,希望這些統計資料能夠對大家理解和分析自己專案在GPU端的效能問題有所幫助。由於過去一年內,UWA的GPU效能指標陸續上線,且針對不同品牌的晶片,其效能指標也差異很多,所以接下來的資料展示主要來自於Mali和高通晶片,且對其對應的效能引數進行了歸類,希望可以讓這些效能指標更符合大家的理解。
1. GPU耗時均值走勢
GPU耗時是每個專案都最為關注的GPU效能指標,我們在這個方面迭代了大量的計算版本來提升該數值的精準性。目前該數值可以針對不同的晶片來進行較為精準地反饋,下面是Mali晶片和Adreno晶片上該指標的效能趨勢。
從上圖可以看出,無論是何種晶片,GPU耗時均值均在15~25ms區間內,且有小幅上升的趨勢。但是,當我們進一步按照裝置檔位來進一步細分GPU開銷時,則會明顯發現,當下遊戲在中低端裝置上的GPU效能壓力較大,如下圖所示,P95數值均大幅高於33ms。
2. GPU Clocks指標統計
為了更精準地讓研發團隊瞭解到自己專案的GPU壓力,我們也統計了GPU Clocks指標的引數範圍和變化趨勢,具體如下圖所示。
GPU Clocks均值走勢
透過趨勢圖我們可以看出遊戲專案依然再向精品化趨勢過渡,但研發團隊更需要關注的是該引數的主體,透過主體範圍的相關數值,研發團隊可以進一步針對自身專案來衡量和制定自身專案的研發標準。
GPU Clocks均值主體範圍分佈
GPU Clocks峰值走勢
GPU Clocks峰值主體範圍分佈
3. GPU利用率(GPU Utilization)
以Mali晶片為例,我們統計了近一年來,大量專案的利用率均值和峰值分佈情況,如下圖所示:
GPU Usage均值主體範圍分佈
GPU Usage峰值主體範圍分佈
從上圖可以看出,目前大部分遊戲專案在中低端檔次裝置上,都存在不同程度的GPU利用率過大問題,這樣和上面GPU耗時分析相吻合,因此,建議研發團隊特別關注自身專案在中低端檔次裝置上的GPU效能壓力,對裝置分級和GPU效能選擇進行更進一步的細緻劃分,從而提高中低端裝置玩家的遊戲體驗。
4. Fragment Shaded引數統計
該引數統計每幀裝置透過Fragment Shader來渲染的畫素值,就目前移動遊戲而言,其最大的GPU效能壓力主要(80%+)來自於Fragment Shading。所以,在UWA GOT Online報告中,會非常詳細地對其進行統計和分析。下圖為不同晶片廠商中,Fragment Shaded引數的均值和峰值趨勢走勢。從圖中可以看出,雖然均值走勢相對比較平穩,但峰值走勢卻在近兩個季度大幅上升。這也預示著未來GPU效能瓶頸依會在整個遊戲行業進一步凸顯。
Fragment Shaded引數均值趨勢
Fragment Shaded引數峰值趨勢
近一年來,該效能引數在不同晶片上的分佈範圍,我們將其重點羅列如下,研發團隊可以根據自己專案的GOT Online報告來進行比對。
Fragment Shaded均值主體範圍分佈
Fragment Shaded峰值主體範圍分佈
5. 總體頻寬均值走勢
GPU頻寬是GPU端非常重要的效能指標,特別是在當下的移動遊戲上。因為頻寬過高會直接影響裝置發熱,進而導致裝置降頻。裝置一旦降頻,無論是CPU還是GPU,其效能均會受到極大影響,所以,移動遊戲研發團隊需要不斷關注自己專案的GPU頻寬問題,及早發現、儘快解決。
下圖為Mali晶片和Adreno晶片的平均頻寬佔用趨勢,基本上都控制在60~80MB/幀,該範圍較為合理。因為如果遊戲以30幀/秒的幀率進行執行,那麼每秒的GPU頻寬將達到1.8~2.4GB,一般我們建議主流機型(比如小米10)的頻寬量儘可能控制在3.0GB/秒以下較為合適,但如果您的遊戲希望達到60幀,那麼該流量則過大了,會很快導致裝置發熱進而降頻,因此,UWA建議研發團隊儘早透過量化指標來建立研發標準,否則越到研發後期,返工成本越高。
總體頻寬均值主體範圍分佈
6. Overdraw分析
Overdraw對於GPU效能的重要程度不言而喻,Overdraw層數越高,意味著每幀GPU要渲染的畫素越多,如果Shader的複雜程度也很高,那麼GPU的效能壓力將會十分巨大。因此,在GOT Online報告中就非常重視Overdraw層數的分析,下圖則是這一年來現有測試遊戲Overdraw的統計分析,我們將以均值和峰值來進行展示。
Overdraw層數均值走勢
在最近一年的移動遊戲測試中,無論是Mali晶片還是Adreno晶片,其Overdraw層數基本上都維持在6~8層左右,如下圖所示。
Overdraw層數均值主體範圍分佈
下圖則是兩款晶片上Overdraw層數的細緻分佈情況。
Overdraw層數峰值走勢
在峰值方面,Overdraw層數峰值逐季度上升,如下所示。一方面隨著我們GPU模式的推出,最近一年的GPU測試遊戲專案在不斷增加;另一方面,也是移動遊戲同樣在朝著精品化不斷髮展。對此,UWA建議研發團隊在研發過程中,特別注意Overdraw的峰值區域,檢視其是否使用合理。一般情況下,造成Overdraw層數較高的原因主要如下:
(1) 技能特效、場景特效(煙、霧、雲等)的不合理製作;
(2) UI介面的疊層過多,特別是不可見的UI介面需要特別注意,“不可見”不代表不渲染;
(3) 多個渲染相機同時工作,但玩家很可能只看到少數幾個。這種情況本質與第(2)點相同,玩家沒看到,但GPU確實實時渲染,造成不必要的資源計算浪費。
造成Overdraw層數過高的情況還有很多,在此我們無法一一列舉,但我們建議研發團隊在日常的研發工作中,儘可能將其作為效能測試的常備觀察項,以便及時發現問題,及時解決問題。
Overdraw層數峰值主體範圍分佈
我們深信資料是會說話的,總有規律值得我們追溯求實、鑑往知來。同時我們也會不斷細化評析的標準、分類等,讓資料更具有代表性和說服力。
*本報告中的資料最終解釋權歸侑虎科技所有。