指標背景
流暢度,顧名思義是用戶感知使用App頁面時的流暢情況,“App卡不卡”,這是用戶最直接的感受。
但是要用量化之后的數據衡量流暢度,在Android平台這邊並沒有直接有效的方式/手段去監控。
幀率&刷新頻率
首先需要了解到兩個概念:
刷新頻率(Refresh Rate)
代表屏幕在一秒內刷新操作的次數,這取決於硬件的固定參數,例如60HZ。
幀率(Frame Rate)
代表GPU在一秒內繪制操作的幀數,例如常見的24fps,60fps,單位是fps(每秒幀數),很多游戲里面也會有這個指標。
24fps&60fps
現在電影行業默認的規則幀率是需要24fps,除了一些極個別的電影超高幀率之外(如李安的比利林恩.中場戰事達到超高幀率120fps),辣么有的同學就問了:是不是幀率越高越好,這里可以給到你肯定的回答:是的!就像顯示器的分辨率一樣,之前認為1080p足夠了,現在用到了4K,5K之后才發現以前的真沒法看。當然支持高幀率也需要對應的硬件設備,emm..話題跑偏了,回到Android流暢度上來,現在Android平台App或者是游戲普遍需要達到60fps用戶肉眼才能感覺到“不卡”。咦?不是24fps嗎?那么問題來了,為什么電影只需要24fps就能是流暢的效果,而App/游戲需要達到60fps?
動態模糊
首先小伙伴們可以看下這張圖,設計功力較渣,大家見諒
第一部分為電影物體運動軌跡,不理解,沒關系,再來看下這張圖
wtf???並不是電影不高清,而且主角在激烈的戰斗啊!!!
怎么樣,相信聰明如你應該懂了,電影每幀不僅會記錄當前時間點的信息,還會記錄物體的運行軌跡。所以我們看到是模糊的效果。
但是游戲/App的幀呢?請看下半部分,每幀只會記下當前時間點的信息,並不會記錄物體的運行軌跡,每一幀都是清晰的,經過GPU渲染加載出來的。
所以動態模糊也是為什么電影只需要24fps的一個原因,那么除了動態模糊還有別的因素會影響的嗎?
有的!
幀間隔/垂直同步/Vsync
說到幀間隔這個名詞大家可能比較陌生,垂直同步相信很多玩游戲的小伙伴在游戲的設置菜單有見過,那么他是用來做什么的呢?
還是來看下面這張圖:
可以看到在電影播放的時候,每幀的間隔時間都是相等的,過度非常平滑。
而在游戲幀/App幀,可能有些場景幀間隔時間較大(比如人民群眾喜聞樂見的國民級手游王者榮耀在團戰的時候),有些場景間隔時間較小(頁面不復雜/簡單應用場景),為什么會造成這個原因呢?
這得從App的渲染機制/原理講起,CPU負責將頁面的布局/元素進行計算將數據推給GPU進行處理,GPU負責進行柵格化(也就是將UI元素繪制到屏幕上),所以幀間隔時間跟頁面結構復雜程度相關,頁面結構越復雜,CPU/GPU所需要的時間越多。
講到這里,可能有些同學馬上想到是不是可以有某種技術可以讓幀間隔的時間保持一致?沒錯,就是垂直同步!系統會每間隔一段時間發送一個Vsync同步信號,當接收到了Vsync就會刷FrameBuffer(簡單理解就是去刷新屏幕顯示),所以有了垂直同步可以解決掉幀間隔不同步的問題。但是事情往往不會這么簡單的,有了垂直同步就可以高枕無憂了嗎?並不會!
丟幀
雖然開啟了垂直同步能夠保證幀間隔時間相等,但是能夠保證每幀都能夠及時的渲染出來嗎?並不能,來看下面這張圖:
系統會每隔16ms去發送Vsync信號通知CPU/GPU可以開始渲染工作了,為什么是16ms?機智如你應該能想到60fps的倒數就是16.67ms(省略后面的小數點)。如果要能夠達到60fps的話,那么就要求每一幀都應該在16ms之內繪制完畢,否則就出現了右邊圖里面的情況-丟幀!16ms之內沒有完成該幀的繪制,那么就必須要等到下次系統的Vsync信號過來了,中間經過的時間就是16ms*2(大致為34ms)。而且丟幀也是App卡頓的根本原因!!!
好了,關於流暢度的解析就先到這里,下篇再給大家講解怎么監控指標以及怎么測試的問題。