Android卡頓分析


卡頓產生的原因: 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:五樓圖文直播輪播卡片

 


免責聲明!

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



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