1. 程式人生 > 其它 >誰懂這篇文,玩遊戲還會卡頓?

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

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

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

** 卡頓分析**

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報告:

引數解析:

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

  2. 任務狀態灰:休眠;藍色:可執行;綠色:執行;橙色:不響應訊號

  3. 函式呼叫

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

  • 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等相關技術,全面提升測試開發工程師的技術實力

點選獲取更多資訊