安卓 App 性能專項測試之流暢度深度解析-中篇


背景

毫無疑問,流暢度在Android眾多性能指標中其重要程度不言而喻,而且也是最為復雜的一個。為了描述這樣的一個維度,業界大佬紛紛提出了各種指標來對其進行衡量。在上篇文章中給大家介紹了FPS這一項指標的由來及卡頓的原理(丟幀),不熟悉的小伙伴可以點擊進入http://www.lemfix.com/topics/245先去了解一番。
但是僅憑借fps指標來去衡量流暢度是遠遠不夠的。

連續繪制的Android應用

對於連續繪制的應用(游戲、視頻)我們可以選用fps指標。

步驟如下:

  • 將手機通過USB線連接之PC端,開發者選項中USB調試打開,保證adb devices能夠檢測到設備
  • 再次進入到開發者選項中,找到GPU呈現模式分析

  • 選擇“在adb shell dumpsys gfxinfo中”

  • 查詢自己要測試應用的包名,可有如下方式:

    1. app運行在前台,通過adb shell dumpsys activity | find "mFocusedActivity"查詢
    2. aapt工具解析APK安裝包,aapt dump badging APK安裝包路徑
    3. 等等...
  • 啟動測試App應用,測試對應的場景,結束后在命令行輸入adb shell dumpsys gfxinfo 應用包名

Draw+Prepare+Process+Execute=完整顯示一幀的時間

這個時間需要小於16.67ms才能保證不丟幀

fps數據分析:

計算總數據的行數(跳過第一行)

frameCount=rowNum(總行數)

計算每幀的渲染時間

renderTime=Draw+Prepare+Process+Execute

當渲染時間renderTime大於16.67ms,該幀渲染超時,算一次丟幀,需要用掉額外的Vsync個數為(多需要的同步信號):

vsyncOverNum=renderTime/16.67-1

fps計算公式為

fps=frameCount*60 / frameCount+vsyncOverNum

非連續繪制的應用

實際上在現在很多的Android應用中,很少有需要不斷的去繪制的場景。比如:

fps很低,為什么我們感覺不到卡頓?

因為本來就用不到那么高的fps,如畫一個動畫0.5秒就畫完了,那么fps最高也就只有30幀/秒,而如果屏幕根本就沒有繪制需求,即屏幕顯示的畫面是靜止的,那fps就是為1。

還有一種情況是:app停止操作后,fps還一直變化,這樣的話fps是否會影響fps准確性?

app停止操作后fps還一直變化,是因為屏幕每一幀的合成都是針對手機里的所有進程,那么即使你的App停止了繪制,手機里其他進程還可能在繪制,比如通知欄的各種消息,這會導致fps繼續變化。

究竟如何衡量非連續繪制應用的流暢度?

在上一篇文章我們講過Vsync信號會通知系統開始繪制並且顯示在屏幕LCD上,如果某一個Vsync信號發過來繪制沒有及時完成,那么Vsync會等到下一周期(16.67ms)再次發送。所以我們可以根據Vsync信號的發送來得到流暢度情況-SM(SMoothness)指標。

恰好有這樣一款工具可以輔助我們得到-騰訊GT(前提是需要將手機root)

勾選要調試的進程

返回到參數界面可以看到SM參數已被勾選

點擊紅色按鈕即可開始測試,場景測試完畢之后即可保存

得到的就是SM相關的數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM