本文章轉載于搜狗測試
對于任何產品來說,流暢度的重要性都不言而喻,流暢度的好壞,對一個產品的體驗和口碑有著極大的影響。今天,小編就和大家一起學習下流暢度評測的相關內容~
什么是流暢度
我們都知道動畫片其實是由一張張畫出來的圖片連貫執行產生的效果,當一張張獨立的圖片切換速度足夠快的時候,會欺騙我們的眼睛,以為這是連續的動作。反之,當圖片切換不夠快時就會被人眼看穿,反饋給用戶的就是卡頓現象。
Android繪制機制及卡頓原因
上圖是在VSync機制下的繪制過程。VSync是Vertical Synchronization(垂直同步)的縮寫,可以簡單地把它認為是一種定時中斷,Android規定,1秒鐘有60個Vsync間隔,每個間隔時間為16.67ms,從圖中看CPU 和GPU處理時間都很快,都少于一個VSync的間隔。
當CPU和GPU處理時間都很慢或者因為在主線程中干活太多,就會出現上圖的現象。從上圖可以看到CPU和GPU處理時間比較慢,都大于一個VSync的間隔,第二個VSync還在處理A區域的繪制。
現在的App每秒中最多能繪制60幀,1000ms/60幀=16.67ms/幀,也就是說對圖像繪制的要求是平均每幀的繪制時間為16.67ms,超過了這個時間就可能造成不流暢的現象。
FPS測試流暢度的不足
FPS(Frames Per Secend)即一秒內繪制的幀數。FPS值越高畫面越流暢。
舉例:在測試輸入法按鍵響應時,當我們按下按鍵到候選繪制完成的時間用了50ms,這個過程只用3幀就完成了,那么FPS就是3幀/秒,可見FPS值非常低,但是我們在測試過程中卻沒有發現卡頓的現象,這是為什么呢?
原因:輸入法在1s內只有3幀的顯示需求,50ms就畫完了,那么FPS最高也只有3幀/秒。我們在使用輸入法時,并沒有每時每刻都在打字、滑動屏幕,很多時候輸入法是處于靜止的狀態,這個時候輸入法界面并不會進行圖像繪制,那FPS就為1,但這個數并不能代表當前App在UI上界面不流暢。
結論:由此可見,FPS來衡量相對靜止App的流暢度并不準確。
SM測試流暢度
VSync機制客戶通過其Loop來了解當前App最高繪制能力,其機制如下:
1)固定每隔16.6ms執行一次;
2)如果沒有繪制事件的時候也會運行這樣一個Loop;
3)Loop在1s之內運行了多少次,即可以表示當前App繪制的最高能力,也就是App卡頓的程度。
if(存在幀的繪制):
Loop = 1 幀繪制完成所占用的Vsync間隔
else:
Loop = 1個Vsync間隔
所以SM計算方法為Loop在1s內運行了多少次(Loops per seconds)。Android機制中有一個Choreographer對象,當收到Vsync信號時,通過postCallback設置的回調函數調用使用者,在每一個Loop運行前通知我們,我們只需要數一下一秒內通知我們的次數就可以了。
使用騰訊提供的測試工具GT對流暢度進行測試,主界面如下圖所示:
使用步驟為:
1)設計流暢度評測的動作;
2)打開“流暢度調試”;
3)點擊“檢測”,如果結果不“OK”,點擊“更改”,然后再點擊“重啟”;如果結果為“OK”,選中被調試的進程后點擊開始;
4)進入“參數”界面,點擊“編輯”,拖動“SM”至“懸浮窗展示的參數”,可以實時看到SM的變化,然后點擊“出參列表”右側的紅色按鈕開始;
5)操作被測App,完成后點擊“SM”可以看到評測的相關數據,包括:次數、平均值、最小值等;
6)點擊“出參列表”右側的紅色按鈕結束,結束后點擊“保存”可以將評測的數據保存在相應的目錄下。
流暢度優化
一開始發現App有卡頓的情況后,首先去查看我們的App是不是存在過度繪制的問題。過度繪制是指屏幕上的某個像素在同一幀的時間內被繪制了多次,在多層次的UI結構里面,如果不可見的UI也在做繪制的操作,這就會導致某些像素區域被繪制了多次。這就浪費大量的CPU以及GPU資源。過度繪制顯示的四種顏色如下圖所示,關于過度繪制詳細問題可參考《Android GPU之過度繪制與圖形渲染優化》