一.FPS(Frame Per Second)
1s內提交到屏幕的幀數(shù)。FPS越高越流暢。
使用FPS衡量手機流暢度的
問題
- fps很低,但是app卻并不卡頓。因為手機沒有很大的繪制需求。比如:在1s內只有15幀的繪制需求,此時fps為15(很低),但是并不卡頓。
- App停止操作后,fps仍然在變化。因為屏幕每一幀針對的是手機上的所有進程,自己的app停止了,其他進程可能會引起屏幕界面變化。比如:app停止后,通知欄更新。
二.VSync垂直同步機制
正常情況:
CPU和GPU在16ms內將一幀的內容在back buffer中繪制完成,并和front buffer交換,當下一個VSync同步信號到來時,Display顯示front buffer的內容。
圖:2-1

(https://note.youdao.com/yws/public/resource/e1de6ab70a6075f4d9f88daf8c95d14b/xmlnote/BD62E109D38C4BF6AB97D02182A9A6F6/18898)
異常情況:
CPU和GPU繪制一幀的內容的事件超過了16ms,導致了掉幀。
圖:2-2

注意
例子中使用的是雙層buffer,實際使用的是三層buffer,可以在下一個Sync信號來臨時,如果CPU空閑,CPU可以利用第三個buffer和GPU同時工作。
圖:2-3

三.為什么感到卡頓
因為此幀的渲染時間不符合用戶的渲染預期。
(比如:上一幀渲染使用了16ms,但是這一幀渲染使用了32ms,這一幀就不符合渲染預期)
使用垂直同步機制的作用
如果不使用垂直同步機制,因為每幀的內容不同,每幀的繪制時間不相同(單幀繪制波動),此幀的渲染時間不符合用戶的渲染預期,所以用戶感到卡頓。
如果使用垂直同步機制:
正常情況下(圖2-1),每一幀的繪制時間為16ms,幀的渲染時間符合用戶預期,用戶就不感到卡頓。
丟幀的情況下(圖2-2,繪制一幀相當使用了32ms)就會出現(xiàn)渲染時間不符合用戶的渲染預期的情況,導致用戶感到卡頓。
四.流暢度
4.1 定義:
1s內Loop運行的次數(shù)(理想狀態(tài)是60)
4.2 使用流暢度衡量APP是否流暢的原理:
系統(tǒng)每隔16ms發(fā)送一次VSync信號,正常情況下,1s內發(fā)送60次VSync信號,Loop運行60次,每次Loop占用16ms(雖然16ms內Loop并不一定一直在工作)。
。
如果因為一幀的繪制任務過多,導致一次Loop的運行時間超過了16ms,此時1s內Loop的運行次數(shù)少于60,同時由之前的垂直同步機制可知,此時會出現(xiàn)卡頓。
所以可以使用流暢度(1s內Loop運行的次數(shù))來衡量APP是否流暢。
4.3 問題:怎樣知道1s內Loop運行的次數(shù) 。
在下一幀到來的時候postFrameCallback指定的callBack會被調用
postFrameCallback(Choreographer.FrameCallback callback)
Posts a frame callback to run on the next frame.