天天看點

Unity手遊iOS記憶體分析和測試

記憶體是Unity手遊的硬傷,如果沒有做好記憶體的相關管理和詳細的測試,遊戲極有可能出現卡頓、閃退等影響使用者體驗的現象。在此,筆者為我們介紹了一些Unity手遊記憶體分析和測試過程中比較實用的測試場景案例、分析方法和解決方案等。由于Android和iOS分析思路比較類似,在這裡我們僅拿iOS記憶體分析和測試為例,供大家參考。

測試目标

保證1G記憶體的iOS裝置(iPhone 6、iPhone 6 Plus等)可在長時間持續遊戲不閃退,同時優化已知的記憶體占用過高問題。

測試分析

由于已知遊戲記憶體占用過高,針對這一問題,要搭建測試環境,模拟玩家的實際操作以及外網的實際情況,測試記憶體的使用情況。一般分為基礎測試、壓力測試和其他測試。

基礎測試,即各種基本操作測試,比如場景切換操作、UI界面操作等;

壓力測試,即多角色操作測試,比如角色的加載、角色的複雜程度、技能和動作的釋放、上線下線操作等等,比如模拟多角色野外場景壓力測試等;

其他測試,比如Xcode的相關工具使用分析等;

在測試中統計各操作對記憶體增長的貢獻,分析可能的原因,并基于測試結果提出合理的優化方案。

測試思路

Unity手遊iOS記憶體分析和測試

◆◆◆

基礎測試

對于基礎測試這一部分,可做的測試較多,我們僅拿UI界面操作測試和場景切換測試為例。

1. UI界面操作測試

主角進入指定場景的固定位置,盡量重複操作所有能操作的UI界面,采樣對比前後的記憶體增長。

測試結果:

Unity手遊iOS記憶體分析和測試

對比兩次采樣結果,單純的界面操作行為,記憶體總共增長了140M,其中增長最多的是UITexture,剩餘的主要是AnimationClip、AnimatorController和其他Texture等。

測試結果分析:

為何UITexture界面貼圖會占用這麼多的記憶體呢? 經分析,為了解決Android平台下打開界面響應過慢的問題,我們對UI界面采用了緩存機制。但是在iOS平台下,首先iPhone的反應速度要優于Android;其次iOS平台(如iPhone 6記憶體隻有1G的裝置)對應用程式的記憶體使用占比控制比Android平台更為嚴格,超過一定閥值系統會自動結束該程序。是以在iOS平台下,速度與記憶體要兼顧,盡可能節約對記憶體的使用。

針對這個問題可以修改界面緩存政策:

根據界面優先級、重要性進行劃分,擇優緩存; 部分大圖集拆小、允許少量小貼圖元素備援;

在後續的優化中,程式修改了界面緩存政策,單純UITexture方面就減少了約80M!如果你的項目也有這方面的需求,非常值得一試哦!

2. 場景切換測試

指定A場景的一個固定位置,主角從A場景切換到B場景,然後從B場景切換到A場景,重複切換多次後,最終回到A場景的固定位置,采樣對比前後的記憶體增長。

對比場景切換前後的記憶體使用情況,發現無明顯的變化。

場景切換前後記憶體無增長,基本保證了切換場景邏輯無記憶體洩露。反之,在測試中如果記憶體增加較多,則需要檢視代碼邏輯修複問題。

壓力測試

對于壓力測試這一部分,由于情況比較多,操作比較複雜,是以要仔細測試。

為何要模拟外網真實環境進行測試呢? 首先就是可能無外網真實環境可用,這個沒有辦法,隻能模拟;其次是外網真實環境過于複雜不利于有效的分析;再次就是外網真實環境不能随時重制利用,并長時間供測試人員分析,是以要盡量去模拟外網環境。

我們就以模拟多角色野外場景壓力測試為例,進行疊代優化。由于需要模拟多人PK的情景,是以我們自己制作了機器人來友善定位并分析多人情況下的性能和記憶體問題。

1. 模拟多角色野外場景壓力測試

模拟測試場景一:

選中一個野外場景A,主角和大量随機門派、随機外觀的機器人進入場景,随機釋放技能,然後機器人全部下線。分不同情況采集資料對比記憶體增長,在機器人全部下線後,主角切換到場景B,再切回測試場景A的原始位置,采集資料對比記憶體增長。

機器人上線後各種不同場景下的内容變化情況如下:

Unity手遊iOS記憶體分析和測試

機器人靜止時,記憶體對比空場景,增長97.5M;

Unity手遊iOS記憶體分析和測試

機器人釋放技能平穩後,記憶體對比空場景,增長119.4M;

Unity手遊iOS記憶體分析和測試

機器人全部下線,記憶體對比空場景,依然增長98.3M;

機器人全部下線後,主角切換場景,再切回測試場景,記憶體對比空場景,基本無增長。

通過上述的測試及結果,結果分析及可獲得的資訊如下:

機器人全部下線後,由于大部分資源進入緩存池,故記憶體有增長是正常的; 機器人全部下線并切換場景後,對比空場景基本無增長,說明緩存池已全部解除安裝,故切換場景的緩存池釋放邏輯正确、無洩漏; 角色相關的絕大部分資源儲存至緩存池,切換場景後,所有進入緩存池的資源全部解除安裝,這一過程看似合理,但存在風險隐患:單場景記憶體峰值存在過高的風險。
單場景記憶體峰值存在過高的風險,究竟會有多高、緩存池到底有無洩露呢? 我們來進一步優化目前的測試環境:既然資源會進緩存池,那麼我們放大它的影響,讓資源不斷進出緩存池。複雜化我們的測試場景,增加機器人不斷上下線操作。

2. 模拟多角色野外場景壓力測試 2.0

模拟測試場景二:

疊代優化“模拟測試場景一”,選中一個野外場景A,主角和大量随機門派、随機外觀的機器人進入場景,在随機時間點,機器人不斷的上下線,線上期間随機釋放技能,每隔五分鐘采樣資料。

a. 采樣資料:

Unity手遊iOS記憶體分析和測試

13min 後遊戲閃退。

b. 資料截圖:

Unity手遊iOS記憶體分析和測試

5:15:37資料截圖

Unity手遊iOS記憶體分析和測試

5:20:55資料截圖

Unity手遊iOS記憶體分析和測試

5:25:02資料截圖

Material、AnimatorOverrideController、Mesh均在持續增長,我們的緩存池存在嚴重的資源洩露。剩下的問題就是解決洩露啦,相信我們程式GG,一定可以快速解決問題的!

在解決洩露問題後,我們的記憶體就真的沒問題了嗎? 我們需要進一步驗證結果。在“多角色測試場景二”的基礎上,我們還可以做些什麼呢?和外網玩家實際情況相比,我們是不是還欠缺了一些東西呢?是的,比如頻繁的聊天、UI界面操作、在地圖内跑動等,再次複雜化測試場景。

3. 模拟多角色野外場景壓力測試 3.0

模拟測試場景三:

疊代優化“模拟測試場景二”,選中一個野外場景A,主角和大量随機門派、随機外觀的機器人進入場景,在随機時間點,機器人不斷的上下線,線上期間随機釋放技能、不停喊話,主角在野外場景中繞地圖兩圈後,選擇固定點站立不動,用低配手機開到遊戲内的最高配置,挂機半小時後,盡量重複操作可操作UI界面後,繼續挂機半小時以上,間隔一定時間采集資料。

全程無閃退,記憶體峰值不超标。

為何要用低配手機開高配模式去測試呢? 因為外網玩家的環境總比我們内部模拟的環境要複雜的多,是以要盡可能以高标準要求整個遊戲的品質。 為何要繞地圖兩周呢? 因為繞地圖兩周後,地圖大部分資源就會進入緩存池中,記憶體會上升。 為何要挂機半小時後再去重複操作可操作的UI界面呢? 因為地圖資源和角色資源該進緩存池的資源基本都進去了,再去操作UI界面,才是真正的記憶體壓力瓶頸,可以撐過這個記憶體瓶頸,才能基本保證記憶體方面基本無重大問題。

這樣複雜的測試環境下,低配手機若可以保證連續運作一個小時以上無閃退,記憶體峰值不超标,就基本保證了遊戲記憶體方面無重大問題了。至此,該測試環境就可以作為釋出版本前,必做的用戶端記憶體壓測案例之一了。

其他測試

Unity手遊需要做優化的東西非常非常多,而記憶體測試僅是其中的一個方向。本文所舉案例中的大部分都可以用Unity自帶的Profiler或插件進行測試,但這隻能針對Unity自身可以抓取到的資源進行分析。若要分析整體記憶體的詳細情況則需使用Xcode的相關工具。

通過Debug Navigator來觀察App的Memory、CPU、FPS等整體情況;

通過Leaks分析記憶體洩漏;

通過AllocationsInstruments來收集所有的配置設定資訊,比如:第三方庫或服務的配置設定情況、蘋果圖形硬體驅動部分 (顯存共享);Lua VM 配置設定和管理部分等。

Allocations Instruments收集所有的配置設定資訊後,我們就可以針對配置設定次數多和配置設定尺寸大的子產品進一步優化。同時,還需關注配置設定效率,因為配置設定得過于零碎,會導緻使用率不高,往往還沒有達到記憶體閥值就已經閃退了。

此外,還有一個便捷的途徑,就是請UWA的專業團隊來幫忙給項目做全方位的優化,包括性能診斷與優化、資源檢測與分析等。該團隊為我們項目做過優化,專業、細緻、深入,整個過程收益頗多,有需求的團隊不妨一試!(小編語:謝謝作者對UWA的支援和厚愛!)

鑒于此次的優化記憶體使用的經驗與教訓,作為測試人員,一定要認真細緻地制定測試步驟并嚴格執行,善于從各種資料中理清頭緒并定位出問題根本原因,以優化目标為導向,以目前的測試結果為修正值,不斷地疊代優化測試環境,這樣才能保證性能測試結果的正确性、發現項目中存在的嚴重問題、給出合理的優化方案及建議并最終保證遊戲的品質。

以上的測試及觀點,不免有遺漏或者不周、不妥的地方,歡迎拍磚、批評指正!

原文出處:侑虎科技

本文作者:admin

轉載請與作者聯系,同時請務必标明文章原始出處和原文連結及本聲明。

繼續閱讀