天天看點

誰懂這篇文,玩遊戲還會卡頓?

​​更多技術文章​​

誰懂這篇文,玩遊戲還會卡頓?

玩遊戲的時候最怕的就是卡頓。排位賽的緊急關頭,明明馬上就能上一段位,卻因為卡頓導緻給對方送人頭。還把對手送上了王者。引起隊友罵聲一片。作為測試工程師的你,可以忍?

卡頓測試也是專項測試裡的一種,更多精彩測試内容,可下方關注公衆号

Android系統每隔16ms會發出VSYNC信号重繪我們的界面(Activity)。App需要在16ms内完成下一次要重新整理的界面的相關運算,以便界面重新整理更新,如果無法在16ms内完成運算,就會發生卡頓,影響使用者體驗。

下面的這些内容可能會造成卡頓:

記憶體問題:記憶體抖動、full gc

cpu:計算耗時

gpu:布局複雜、overdraw

就是執行GC操作時,需要暫停線程的任何操作,GC操作完成,其他操作才能繼續,頻繁的GC會導緻界面卡頓,頻繁GC有兩個原因:

記憶體抖動(Memory Churn),建立大量的對象,在短時間内馬上釋放。

産生大量對象會占用Young Generation的記憶體區域, 如果剩餘空間不足,就會觸發GC。同時,大量對象的疊加也會增加Heap的壓力,進而觸發更多的GC操作。

UI渲染由CPU和GPU分工完成,CPU負責布局元素的運算(比如Measure, Layout)。GPU負責栅格化處理(将UI元素繪制到螢幕上)。

UI布局層次太深, 或者自定義控件的onDraw函數中存在複雜運算, 就需要CPU負荷工作,進而影響整個繪制過程。

過度繪制會導緻gpu負荷,每屏的每一幀,像素點應該隻被繪制一次,如果重複繪制像素點,就是過度繪制。

Android可以檢視過度繪制:“設定”→“開發者選項”→“調試GPU過度繪制(toggle GPU overdraw)”,打開後再通路App會出現下圖:

誰懂這篇文,玩遊戲還會卡頓?

此時界面可能會有五種顔色辨別:

原色:沒有overdraw

藍色:1次overdraw

綠色:2次overdraw

粉色:3次overdraw

紅色:4次及4次以上的overdraw

卡頓的關鍵因素是無法在16ms内繪制一幀,sdk自帶的systrace工具可以分析每一幀的繪制情況,并且給出補救措施和建議。

需要安裝sdk,在sdk目錄下存在systrace.py:

python{sdk目錄}/platform-tools/systrace

1

2

注意:運作此工具需要python2.7。

如果運作中出現如下錯誤,安裝對應的依賴即可:

No module win32con

pip2 install pypiwin32

No module six

pip2 install six

1

2

3

4

5

首先連接配接一個Android裝置:192.168.181.102:5555

在指令行輸入:

python systrace.py -e 192.168.181.102:5555

1

2

在裝置上進行操作在指令行:按下enter,完成錄制。此時會生成一份html報告,整個過程如下:

誰懂這篇文,玩遊戲還會卡頓?

點選生成的html報告: 

誰懂這篇文,玩遊戲還會卡頓?

參數解析:

誰懂這篇文,玩遊戲還會卡頓?

1.幀點:綠色表示16.6ms内,黃、紅色超過16.6ms

2.任務狀态灰:休眠;藍色:可運作;綠色:運作;橙色:不響應信号

3.函數調用

在報告的頁面有快捷鍵操作:

w:放大

s:縮小

m:找到下一幀,顯示時間

如果一個幀的繪制時間超過0.7s,使用者會明顯感覺到卡頓,稱之為冰凍幀,比如上面紅色的幀點。如果幀的繪制時間剛好超過0.6ms,稱之為掉幀,比如上面黃色的幀點,但部分掉幀影響不大,主要危險來自于冰凍幀。