卡頓產生的原因: 1、CPU 資源消耗原因;2、GPU 資源消耗原因。
CPU上文已經闡述,接下來說一下GPU。一般安卓流暢度測試,關注圖片處理器每秒刷新的幀數(FPS),他用來指示頁面是否平滑的渲染。高的幀率可以得到更流暢,更逼真的動畫,不過幀率達到60fps以上,人眼主觀感受到的差別就不大了。所以以60fps作為衡量標准,即要求每一幀刷新的時間小於16ms,這樣才能保證滑動中平滑的流暢度。
備注:GPU呈現模式用來測量app的幀速率,屬於GPU,Profile工具的一種.目前安卓基礎60fps以滿幀數計算,60fps在一秒沒繪制造成,所以可以計算出1÷60≈1.66(繪制每幀需要的時間約為16ms)
1、GPU呈現模式分析(Peofile GPU Rendering tool)
測試方法:
a、點擊Android設備的“設置”->"開發者選項",然后勾選“GPU呈現模式分析”。
b、打開開發者選項后勾選”GPU呈現模式分析”后選擇“屏幕上顯示為條形圖”這樣可以直觀的看出每個時間點的幀數大小。如下圖:

圖6
當你的應用程序在運行時,你會看到一排柱狀圖在屏幕上,從左到右動態地顯示,每一個垂直的柱狀圖代表一幀的渲染,越長的垂直柱狀圖表示這一幀需要渲染的時間越長.隨着需要渲染的幀數越來越多,他們會堆積在一起,這樣你就可以觀察到這段時間幀率的變化。
參數介紹如下:
l 綠色水平線代表16ms,要確保一秒內打到60fps,你需要確保這些幀的每一條線都在綠色的16ms標記線之下.任何時候你看到一個豎線超過了綠色的標記現,你就會看到你的動畫有卡頓現象產生.
l 藍色代表測量繪制的時間,或者說它代表需要多長時間去創建和更新你的DisplayList.在Android中,當你看到藍色的線很高的時候,有可能是因為你的一堆視圖突然變得無效了(即需要重新繪制),或者你的幾個自定義視圖的onDraw函數過於復雜.
l 紅色代表執行的時間,這部分是Android進行2D渲染 Display List的時間,為了繪制到屏幕上,Android需要使用OpenGl ES的API接口來繪制Display List.這些API有效地將數據發送到GPU,最總在屏幕上顯示出來.
l 橙色部分表示的是處理時間,或者說是CPU告訴GPU渲染一幀的時間,這是一個阻塞調用,因為CPU會一直等待GPU發出接到命令的回復,如果柱狀圖很高,那就意味着你給GPU太多的工作,太多的負責視圖需要OpenGL命令去繪制和處理.
c、如果需要分析具體詳細的數據,需要結合下面的命令來進行,選擇顯示於adb shell dumpsys gfxinfo來使用,然后輸入:adb shell dumpsys gfxinfo"你自己的應用名字" > fps.txt 后,在電腦中找到fps.txt文件,找到"Profile datain ms"的Draw Process Exceute這三列數據,Excel做出表格,sum出每列的總GPU時間,如圖:


圖7-8
l Draw 對應於藍色線:是消耗在構建java顯示列表DisplayList的時間。說白了就是執行每一個View的onDraw方法,創建或者更新每一個View的DisplayList對象的時間。
l Process 對應於紅色線:是消耗在Android的2D渲染器執行顯示列表的時間。你的視圖層次越多,要執行的繪圖命令就越多。
l Execute 對應於橙色線:是消耗在排列每個發送過來的幀的順序的時間.或者說是CPU告訴GPU渲染一幀的時間,這是一個阻塞調用,因為CPU會一直等待GPU發出接到命令的回復。
2、FPS Meter測試安卓幀數
FPSMeter是一款非常實用的小軟件,能夠用數字實時顯示安卓界面的每秒幀數,非常直觀。此外,FPS Meter還可以顯示最大幀數、最小幀數以及平均幀數。由於涉及到了系統功能,所以FPSMeter需要root。如果你打算嘗試,請先root機后再使用。開啟服務后,即可看到有幀數顯示於界面上。這里要注意,使用FPS Meter測量幀數需要在開發者選項中停用HW疊加層才會比較准確。
3、在程序種畫一個圓點,計算圓點1秒繪制次數
貼吧目前記錄FPS值的方法是,在程序中創建僅有一個圓點的view,然后計算該view每秒被繪制的次數。理想值:1秒繪制60次
4、AndroidStudio 自帶 GPU測功能
如下圖,AndroidStudio自帶GPU監控功能,縱軸表示每楨繪制的時間,橫軸是運行時間。

圖9
上述四種方法就是測試FPS流暢度的常用方法。當QA發現有卡頓問題時,可以從以下幾點着手分析,逐一排查。
1、內存占用過多,GC次數高,阻塞主線程;
2、主線程做了些無關的耗時操作,eg:在滑動過程中打日志,訪問過多io;
3、過度渲染,渲染層級太多或者次數太多,導致渲染時間長 eg:滑動過程中,動畫導致整個列表重新繪制;
4、創建view時,過多的動態創建或者復雜頁面創建時間過長。eg:五樓圖文直播輪播卡片。
