流暢度測試簡單的來說就是Android頁面繪制。Android系統(tǒng)每秒60hz,也就是大約每16ms刷新一次界面。但是在我們使用APP過程中,經(jīng)常會看到頁面有卡頓,或者說丟幀的現(xiàn)象。也就是說可能此刻兩個頁面繪制的時間差超過0.1S(人眼視覺殘留0.1S)。總的來說,就是頁面
原理分析
在確定衡量指標(biāo)之前,先來說Android的UI更新機制。
在Android版本更新過程中,發(fā)現(xiàn)在Jelly Bean中Google加入了一個Project Butter,用來解決嚴(yán)重影響Android口碑的問題之一“UI流暢性差”的問題。而Project Butter中主要引入了三個核心元素:VSYNC(垂直同步)、Triple Buffer和Choreographer。
VSync是Vertical
Synchronization(垂直同步)的縮寫,是一種在PC上很早就廣泛使用的技術(shù),可以簡單的把它認(rèn)為是一種定時中斷。而在Android 4.1(JB)中已經(jīng)開始引入VSync機制。CPU和GPU的處理時間都少于一個VSync的間隔,即16.6ms。如果每個間隔都有繪制的情況下,當(dāng)前的FPS即為60幀。
VSync機制就像是播放動畫片(60幀/s)。每次都會播放畫面,有的時候有人偷懶了,機器壞了,就會出現(xiàn)播放速度降低的狀況。我們把這個播放速度叫做流暢度。
從FPS&丟幀到流暢度
實際上在很多Android的App中,很少有需要不斷地去繪制的場景,很多時候頁面都是靜態(tài)的。也就是會出現(xiàn)這樣的狀況,雖然1s中VSync的60個Loop不是每個都在做繪制的工作,FPS會比較低,但并不代表這個時候程序不流暢(如我將App放著不動,實測FPS為1)。所以FPS較低并不能代表當(dāng)前App在UI上界面不流暢,而1s內(nèi)VSync這個Loop運行了多少次更加能說明當(dāng)前App的流暢程度。所以,下面這2個指標(biāo)比FPS更能代表當(dāng)前的App是否處于流暢的狀態(tài)。同樣這2個指標(biāo)更加能夠量化App卡頓的程度:
1)丟幀(SF: Skipped
Frame):如上圖2所示情況應(yīng)該在16.6ms完成工作卻因各種原因沒做完,占了后n個16.6ms的時間,相當(dāng)于丟了n幀。
2)流暢度(SM: SMoothness):和丟幀相對,在VSync機制中1s內(nèi)Loop運行的次數(shù)。
和丟幀相對1s內(nèi)有60個Loop因為某幾次工作時間超過了16.6ms(丟幀),這樣Loop就無法運行60次(理論最大值)。
當(dāng)流暢度越小的時候說明當(dāng)前程序越卡頓。
如何得到流暢度(SM: SMoothness)
接著上面的結(jié)論,如果在這樣的機制下每次Loop運行之前進行通知,記個數(shù)就好了。
很幸運我們在新的Android的那一套機制中找到了一個畫圖的打雜工Choreographer這個對象。根據(jù)Google的官方API文檔描述中,它是用來協(xié)調(diào)animations、input以及drawing時序的,并且每個Loop共用一個Choreographer對象。
結(jié)論
通過如上原理分析可以得出結(jié)論:
1) Android 4.1引入了VSync機制后,可以通過其Loop來了解當(dāng)前App最高繪制能力。
固定每隔16.6ms執(zhí)行一次(這個值是一個靜態(tài)變量,會根據(jù)系統(tǒng)版本不同而采用不同的值,目前測試版本是16.6ms這樣最高的刷新的幀率就控制在60FPS以內(nèi));
如果沒有以上事件的時候同樣也會運行這樣一個Loop;
這個Loop在1s之內(nèi)運行了多少次,即可以表示當(dāng)前App繪制的最高的能力,也就是Android App卡頓的程度;
另外,在一次Loop時如果執(zhí)行時間超過了16.6ms,那么用多于16.6ms的時間除以16.6ms,即是當(dāng)前App的丟幀(SF: Skipped Frame)。
2) 可以在Choreographer的回調(diào)FrameCallback中,按秒計數(shù)表示當(dāng)前App的流暢程度,即流暢度SM(SMoothness)。
采用這樣方式就可以在App內(nèi)部觀測當(dāng)前App的流暢度了。并且在丟幀的地方打印traceView,就可以知道丟幀的大概原因,大概位置。定位代碼問題。
|
|