【求知探新】《為誰而煉金》UI界面載入性能分析
原文鏈接:【求知探新】《為誰而煉金》UI界面載入性能分析 - UWA Blog
【求知探新】是UWA新推出的欄目。在UWA團隊做性能優化的過程中,常常會遇到一些未知的問題,在這裡我們將分享UWA研究這些問題的完整過程。當然需要說明的是,一個好的問題沒有標準的答案,在此也歡迎大家來積極拍磚!
今天分享的內容,來自UWA對DeNA《為誰而煉金》手游的UI界面載入性能分析。
一、問題描述
研發團隊反饋部分UI界面的交互反應速度較慢,具體操作如下圖:點擊主頁面(左圖)的「英靈」按鈕,UI界面會進入過渡界面(中圖),最終進入「英靈」界面(右圖),整個過程中打開速度較慢,大約4秒鐘。
二、問題復現
我們在紅米Note2(低端)和三星S6(中高端)設備上分別進行了嘗試,點擊該按鈕後,UI界面出現確實較慢(4秒鐘左右)。
三、問題分析
我們首先通過Profiler來進行測試,下圖為紅米Note2設備上的性能分析。我們發現,在點擊「英靈」按鈕後,UI開啟過程中主要經過兩個階段:紅框部分為資源載入期,藍框部分為UI界面載入期。可以看到,雖然都是Loading.UpdatePreloading函數在載入,但其每幀的開銷均很小,在藍框期間,遊戲的總耗時更是小於33ms。這說明研發團隊對於此處的UI界面載入為非同步載入。
上圖為資源載入期的CPU耗時,下圖為UI界面載入期的CPU耗時
對此,我們的建議如下:
(1) 載入切換由於是非同步載入,且每幀的CPU利用率過低,因此,建議研發團隊對特定UI嘗試同步載入來減少UI的切換時間;
(2) 同步載入可能會造成切換界面運行得「不流暢」,對此,研發團隊也可以考慮加大每幀非同步載入的資源數量,從而減少紅框和藍框處的等待時間。
同時,我們在UWA性能報告中發現了每次點擊UI後,均有規律性的單幀高開銷(Profiler中存在耗時卡頓,但未發現該具體耗時項,我們推測是Profiler統計時出現了跳幀問題),如下圖紅框所示。經過定位,其52%的開銷來自於Resources.UnloadUnusedAssets API,如下圖性能堆棧中的GarbageCollectAssetsProfiler所示。對此,建議研發團隊儘可能避免頻繁的Resources.UnloadUnusedAssets,根據資源用量每5~10分鐘調用一次即可。
四、結論
該UI界面載入耗時較大主要有兩方面組成:
(1)大量資源的非同步載入,導致每幀CPU利用率較低;
(2)Resources.UnloadUnusedAssets API的不合理調用。
對此,建議研發團隊根據第三節中的詳細說明進行進一步地檢測和完善。
文末,感謝DeNA對於UWA團隊的認可,並同意將以上研究過程中的性能數據在此分享。同時,我們也歡迎大家在UWA問答社區(answer.uwa4d.com)積極提交研發過程中遇到的問題。也許隨著時間的流逝,科技的進步,答案將變得廉價,但問題會變得更有價值,因為提問和研究將比回答更有力量。
PS:《為誰而煉金》是一款富有壯大的故事情節以及高度的戰略性的RPG戰棋遊戲,喜歡這款手游的童鞋們可以在官方網站上預約啦:http://fwg.mobage.cn/
推薦閱讀:
※多個提高Node.js應用吞吐量的小優化技巧介紹
※【譯】針對 Airbnb 清單頁的 React 性能優化
※記一次冷雨寒風中的UWA優化日(內附技術PPT)
※Unity優化技巧(上)
※Android應用內存泄露分析、改善經驗總結