背景
毫無疑問,流暢度在Android眾多性能指標中其重要程度不言而喻,而且也是最為復雜的一個。為了描述這樣的一個維度,業界大佬紛紛提出了各種指標來對其進行衡量。在上篇文章中給大家介紹了FPS這一項指標的由來及卡頓的原理(丟幀),不熟悉的小伙伴可以點擊進入http://www.lemfix.com/topics/245先去了解一番。
但是僅憑借fps指標來去衡量流暢度是遠遠不夠的。
連續繪制的Android應用
對於連續繪制的應用(游戲、視頻)我們可以選用fps指標。
步驟如下:
- 將手機通過USB線連接之PC端,開發者選項中USB調試打開,保證adb devices能夠檢測到設備
- 再次進入到開發者選項中,找到GPU呈現模式分析
- 選擇“在adb shell dumpsys gfxinfo中”
-
查詢自己要測試應用的包名,可有如下方式:
- app運行在前台,通過adb shell dumpsys activity | find "mFocusedActivity"查詢
- aapt工具解析APK安裝包,aapt dump badging APK安裝包路徑
- 等等...
-
啟動測試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相關的數據。