誰懂這篇文,玩遊戲還會卡頓?
玩遊戲的時候最怕的就是卡頓。排位賽的緊急關頭,明明馬上就能上一段位,卻因為卡頓導致給對方送人頭。還把對手送上了王者。引起隊友罵聲一片。作為測試工程師的你,可以忍?
卡頓測試也是專項測試裡的一種,更多精彩測試內容,可下方關注公眾號
** 卡頓分析**
Android系統每隔16ms會發出VSYNC訊號重繪我們的介面(Activity)。App需要在16ms內完成下一次要重新整理的介面的相關運算,以便介面重新整理更新,如果無法在16ms內完成運算,就會發生卡頓,影響使用者體驗。
下面的這些內容可能會造成卡頓:
-
記憶體問題:記憶體抖動、full gc
-
cpu:計算耗時
-
gpu:佈局複雜、overdraw
記憶體
就是執行GC操作時,需要暫停執行緒的任何操作,GC操作完成,其他操作才能繼續,頻繁的GC會導致介面卡頓,頻繁GC有兩個原因:
-
記憶體抖動(Memory Churn),建立大量的物件,在短時間內馬上釋放。
-
產生大量物件會佔用Young Generation的記憶體區域, 如果剩餘空間不足,就會觸發GC。同時,大量物件的疊加也會增加Heap的壓力,從而觸發更多的GC操作。
CPU
UI渲染由CPU和GPU分工完成,CPU負責佈局元素的運算(比如Measure, Layout)。GPU負責柵格化處理(將UI元素繪製到螢幕上)。
UI佈局層次太深, 或者自定義控制元件的onDraw函式中存在複雜運算, 就需要CPU負荷工作,從而影響整個繪製過程。
GPU
過度繪製會導致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
注意 :執行此工具需要python2.7。
如果執行中出現如下錯誤,安裝對應的依賴即可:
No module win32conpip2 install pypiwin32No module sixpip2 install six
使用
首先連線一個Android裝置:192.168.181.102:5555
在命令列輸入:
python systrace.py -e 192.168.181.102:5555
在裝置上進行操作在命令列:按下enter,完成錄製。此時會生成一份html報告,整個過程如下:
點選生成的html報告:
引數解析:
-
幀點:綠色表示16.6ms內,黃、紅色超過16.6ms
-
任務狀態灰:休眠;藍色:可執行;綠色:執行;橙色:不響應訊號
-
函式呼叫
在報告的頁面有快捷鍵操作:
-
w:放大
-
s:縮小
-
m:找到下一幀,顯示時間
幀分析
如果一個幀的繪製時間超過0.7s,使用者會明顯感覺到卡頓,稱之為冰凍幀,比如上面紅色的幀點。如果幀的繪製時間剛好超過0.6ms,稱之為掉幀,比如上面黃色的幀點,但部分掉幀影響不大,主要危險來自於冰凍幀。
也可以用adb自帶的工具對幀進行分析,但資料不如systrace精準:
adb -s devicesname shell dumpsys gfxinfo |less
** _
來霍格沃茲測試開發學社,學習更多軟體測試與測試開發的進階技術,知識點涵蓋web自動化測試 app自動化測試、介面自動化測試、測試框架、效能測試、安全測試、持續整合/持續交付/DevOps,測試左移、測試右移、精準測試、測試平臺開發、測試管理等內容,課程技術涵蓋bash、pytest、junit、selenium、appium、postman、requests、httprunner、jmeter、jenkins、docker、k8s、elk、sonarqube、jacoco、jvm-sandbox等相關技術,全面提升測試開發工程師的技術實力