作者:Oliver,騰訊WeTest團隊産品經理。
為了避免手機性能成為遊戲選擇時的壁壘,遊戲廠商必須進行更好的遊戲性能優化。本文利用WeTest平台的Cube工具,通過三步完成遊戲記憶體檢測與分析的過程,希望為遊戲開發者提供一些記憶體優化的方法和思路。
衆所周知,手遊在2016年進入了成熟期,全球的開發商數量在減少,遊戲增速也在放緩,更少的遊戲意味着高品質的遊戲将獲得更多的傳播和更久的生命力,品質的提升就會帶來畫面的美化、場景的豐富等,對手機性能也帶來了更多的考驗。為了避免手機性能成為遊戲選擇時的壁壘,遊戲廠商必須進行更好的遊戲性能優化。
那麼,遊戲性能是什麼?遊戲性能就是決定了遊戲耐久度,承載能力和運作速度的因素。

簡單來說,遊戲性能決定了你的遊戲能否跑的更穩,跑的更久,跑的更快。進入了手遊精品時代之後,為什麼不管什麼遊戲,言必談手遊性能?因為在PC時代,如果遊戲性能優化一般,玩家加個記憶體換個CPU或者刷個主頻就能輕松搞定;到了手遊時代後情況則顯得比較嚴峻,捉襟見肘的記憶體使得資源加載時如履薄冰,加上高中低不同配置的機型讓性能問題顯得更加突出,對于玩家來說,為了一款遊戲而更換手機的可能并不大,一個低端機型上的卡頓就可能造成一大批使用者的流失,如果手遊性能表現糟糕,再好的遊戲設計都會付諸東流。
那麼什麼樣的手遊才是更穩,更久,更快的呢?
我們一般看這樣幾個名額:
對于手遊來說,這些名額的情況就決定了遊戲的實際表現,如果光看這些名額沒有直覺的感受,可以看下圖:
如果說左邊是玩家經常會遭遇到的表面現象,那右邊則是基于手遊性能深挖後的問題本質。
為了讓遊戲的優化能夠更加系統,更加有的放矢,騰訊WeTest将監控手遊性能相關的每個名額,并根據測試的結果進行優化。
那麼,先來說說手遊性能的重頭,記憶體名額的檢測。為什麼是重頭呢?記憶體的占用過高通常會帶來“遊戲閃退”、“卡頓”、“系統重新開機”等現象,其中每一個結果基本都對遊戲的體驗是緻命的。我們從騰訊WeTest平台的Cube工具出發,通過簡單的三步,介紹如何通過記憶體的檢測,發現記憶體管理的問題,優化手遊的性能。
首先要注意:手機必須root
登入WeTest官網,在“産品“菜單下選擇”性能測試“,點選”Unity用戶端性能測試“
或者直接登入,點選“Android版 下載下傳”,也在頁面末尾掃描二維碼直接下載下傳。
安裝好用戶端後點選WeTest助手啟動,選擇一種賬号登入方式登入。
測試類型選擇“Cube”。
首先确認“手機狀态”為”手機已Root“;
點選“應用選擇”選擇需要測試的應用(選擇Unity遊戲) ,非Unity遊戲可以點選“通用性能檢測”
選擇測試類型,測試類型分為四類:Unity性能測試(标準)、Unity性能測試(重度)、Unity資源測試、Mono記憶體檢測。
那麼這時候,問題就來了,一般應該先開始進行哪項測試呢? 選項一:Unity性能測試(标準)
首先我們看第一個,Unity性能測試(标準),該測試主要滿足Unity引擎遊戲日常性能稽核的測試需求,覆寫FPS、CPU、PSS、Mono記憶體峰值四個次元;建議使用該測試擷取準确性能資料,了解遊戲的一個整體的性能表現,如果測試結果良好,說明遊戲目前的性能表現已經非常好了,可以不需要進行很大程度的優化;如果測試結果不好,則可以考慮進行其他的測試子產品。 選項二:Unity性能測試(重度)
該測試在性能測試(标準)的基礎上,增加了函數耗時統計、單個FPS點中各幀的幀時間、Drawcall數量及每個函數具體出現的位置;建議使用該測試定位性能問題,為之後的性能優化做準備。 選項三:Unity資源測試
該測試可以擷取遊戲過程中多種資源資料,包括資源重複率、GameObject數量 、2D紋理大小 、網格大小 、動畫剪輯大小 、音頻大小 、關卡間保留資源 、Material對象拷貝數量等。建議在對記憶體優化進入到了資源階段的時候,可以進行這個測試。 選項四:Mono記憶體檢測
該測試提供了擷取快照點的Mono記憶體對象情況(對象類型、對象大小、對象堆棧、對象引用關系 等);建議在定位存在問題的記憶體時,可以進行這個測試。
确定測試類型之後,點選“開始測試”
a.Unity性能測試(标準)、Unity性能測試(重度)、Unity資源測試中都可以通過點選“開始記錄”、“結束記錄”來記錄核心場景的性能資料、資源資料。
b.Mono記憶體檢測中通過點選“mono記憶體快照”擷取目前mono記憶體的詳細情況,單次測試中可以任意在需要快照點的位置設定快照。
“上傳”,退出遊戲,選擇測試遊戲的遊戲類型(最多選擇兩類),點選“确定”,在彈出的上傳頁,點選“上傳”,完成資料的上傳。
4.日志日志主要是記錄曆史測試資料,顯示曆史測試中資料是否上傳的狀态,綠色為“已上傳”,紅色為“未上傳”。通過點選“清空曆史記錄”可以清除用戶端的日志中記錄的曆史資料。
第二步:檢視報告中的記憶體情況點選“我的首頁”
測試類型選擇“Cube”
找到測試報告,點選“檢視”
第三步:分析報告如果要對手遊記憶體管理進行優化,首先要明确一個分析的政策,Cube團隊的建議是看四塊内容:
了解手遊記憶體整體表現
通過mono記憶體檢視是否發生記憶體洩漏
通過mono快照定位存在問題的記憶體
通過記憶體配置設定總表定位存在問題的函數
要觀察手遊記憶體的整體表現,首先觀察遊戲的堆記憶體峰值是否超過了建議值,如下圖:
其中,建議值的來源是根據騰訊内部的性能标準,對手機的配置等級而形成的記憶體門檻值,圖中的高配機型,PSS記憶體峰值到達450MB或者mono記憶體到達50MB的時候就會開始預警。
如果需要更加詳細的名額情況,可以選擇“性能報告”部分中的“mono記憶體”:
如下圖,我們可以看到記憶體峰值的超标線,如果超過,那麼那一刻你的遊戲極有可能出現上述“閃退”,“卡頓”和“系統重新開機”的現象了;如果沒有超過,那麼恭喜你,繼續進入下一個關卡,檢查你的遊戲是否存在記憶體洩漏的現象。
對于目前絕大多數基于Unity引擎開發的項目而言,其托管堆記憶體是由Mono配置設定和管理的。“托管” 的本意是Mono可以自動地改變堆的大小來适應你所需要的記憶體,并且适時地調用垃圾回收(Garbage Collection)操作來釋放已經不需要的記憶體,進而降低開發人員在代碼記憶體管理方面的門檻。
那麼我們所說的記憶體洩漏情況,就是遊戲在調用了一些資源結束之後(比如MOBA遊戲中的5V5副本),沒有及時的釋放這些記憶體,進而導緻堆記憶體的大小越來越多,進而超過了手機記憶體的門檻值。
在比較合理的記憶體政策下,mono記憶體應該上升到一定階段之後便不再變化,如下圖:
如果記憶體産生了洩漏,便有可能出現下圖的情況,堆記憶體的數值階段性的不斷提升。
如果你的遊戲堆記憶體出現了不斷上升的情況,需要排查一些記憶體洩漏的原因,可以進入下一個階段,檢查具體場景中記憶體的配置設定情況。
對于mono記憶體洩漏,一般隻能通過猜測+不斷修改代碼測試的方法來修複問題,效率很低,騰訊WeTest平台的Cube工具提供了mono記憶體快照對比的功能,并包括對象配置設定堆棧,對象引用關系等詳細資訊,是定位mono記憶體洩漏問題的一大利器。在具體操作中,需要我們進行一次“mono記憶體檢測“,具體操作可見上文”第一步“和”第二步“。
在“mono記憶體檢測“的測試報告中,我們可以發現測試報告對每個場景都進行了标記,形成了一個”snapshot(快照)“,對比兩次snapshot,檢視兩者之間的新增對象:
這些不同的snapshot記憶體使用情況的波動意味着遊戲在進行遊戲記憶體配置設定和釋放,通過對這些snapshot進行對比,可以發現哪些記憶體新增了,哪些記憶體保留了,進而找到遊戲在記憶體配置設定上産生的問題,那麼如何進行操作呢?
如上圖所示,在“mono記憶體檢測“的測試報告中,每兩個snapshot都可以進行對比,通過滑鼠單擊就可以選擇,選中兩個場景之後就可以點選”送出對比“:
點選之後會得到兩個場景之間的記憶體配置設定比較,其中”對象堆棧“就代表遊戲中實作的一個對象,以MOBA遊戲為例,上圖中的snapshot1和snapshot2所對應的兩個場景可能就是“5V5戰鬥副本“和”遊戲大廳“,通過右上角的”快照間新增top50“和”快照間保留top50“,我們可以了解到這兩個不同的場景之間,哪些對象的資源被保留了,哪些對象的資源新增了(如果需要更多資料,可以點選右上角的”下載下傳對比報表“),而這些行為是否是遊戲程式所需要的。
可以看到,按鈕按下前後新增的最大對象即為代碼中生成的Byte對象,并且該對象被引用的次數為1。
那麼,如何在遊戲運作中看待這種快照之間新增或保留堆棧的現象?
比如說,王者榮耀這類MOBA遊戲在副本和遊戲大廳之間,會保留地圖和NPC的對象資源,保證下次開始遊戲時可以更快的讀取和進入遊戲;
而天天酷跑之類的跑酷遊戲在在副本和遊戲大廳之間,就不會保留地圖和NPC的對象資源,原因就在于王者榮耀這類的MOBA遊戲,地圖和NPC的出現的情況是完全相同的,為了更好的遊戲體驗,保留對象資源是合适的;而天天酷跑之類的跑酷遊戲,有不同的關卡副本,如果保留對象資源,會導緻記憶體不斷的被占用,是以選擇不保留對象資源。
是以我們可以說,記憶體配置設定是否合理沒有絕對意義上的标準,都要遊戲開發者根據自己的開發政策,結合mono記憶體檢測的報告,判定記憶體配置設定的情況是否在自己的計劃之中。
重新重新整理一下報告,我們最後來看一下遊戲整體運作過程中具體功能的記憶體配置設定的情況:
圖中的”配置設定堆棧“代表的就是遊戲每次調用的一個函數,開發人員需要關注右上角”配置設定總次數“和”配置設定總大小“,關注是否有函數頻繁配置設定記憶體,根據計劃中的記憶體配置設定和實際的記憶體配置設定情況,開發人員應該進行針對性的優化。
測試報告分析到這裡,基本可以發現記憶體管理方面存在的一些配置設定方面的問題了,但是記憶體優化的道路,到這裡才完成了一半,Unity遊戲在運作時的記憶體占用情況可以用下圖表示:
Mono記憶體和native記憶體是PSS記憶體主要的組成部分,mono記憶體更多的起到記憶體調用的功能,是以常常成為了開發人員優化記憶體的起點;而native記憶體中包含了大量對象的資源,也是記憶體優化中的重要部分,這部分内容在測試報告中也有具體的細分,如下圖:
這部分的記憶體檢測,将在後面的幹貨中繼續介紹。
針對手遊的性能優化,騰訊WeTest平台的Cube工具提供了基本所有相關名額的檢測,為手遊進行最高效和準确的測試服務,不斷改善玩家的體驗。目前功能還在免費開放中。點選立即體驗!
商業轉載請聯系騰訊WeTest獲得授權,非商業轉載請注明出處。