Android的顯示系統(tǒng)一直使用雙緩沖和VSync來(lái)防止屏幕畫(huà)面發(fā)生撕裂現(xiàn)象,這也是其他系統(tǒng)的常規(guī)操作。Android的不同之處是將VSync運(yùn)用到繪制系統(tǒng)中,作為黃油計(jì)劃(Project Butter)的一部分,用以提升系統(tǒng)的流暢度。
VSync:
Android中VSync的作用是統(tǒng)一系統(tǒng)繪制與顯示節(jié)奏(Apps和SurfaceFlinger),大家各司其職,確保在VSync來(lái)的時(shí)候干活,這樣系統(tǒng)理論上就絲滑了。
如下圖,在沒(méi)有VSync的情況下,系統(tǒng)渲染的節(jié)奏與屏幕刷新的節(jié)奏不一致,如果某一幀系統(tǒng)渲染的比較晚,那么就會(huì)出現(xiàn)屏幕兩次刷新都顯示同一份內(nèi)容的情況,也就是Jank(掉幀)。
有了VSync的話,系統(tǒng)會(huì)在VSync到來(lái)時(shí)進(jìn)行繪制,與屏幕的刷新節(jié)奏保持一致,這樣就大大降低了jank的概率。
那么問(wèn)題來(lái)了,怎么讓Apps根據(jù)VSync的節(jié)奏來(lái)進(jìn)行繪制呢?App依賴系統(tǒng)的繪制系統(tǒng),所以必須讓繪制系統(tǒng)聽(tīng)命令才行,這就是Choreographer出現(xiàn)的原因。
Choreographer:
Choreographer(編舞者)的作用在源碼的注釋中已經(jīng)寫得很明白,是用來(lái)接收定時(shí)脈沖信號(hào)來(lái)控制繪制的模塊。也就是說(shuō),有了Choreographer,apps就能夠根據(jù)Vsync信號(hào)來(lái)進(jìn)行周期性的繪制工作。
以上兩者配合就基本上完成了Android中VSync的改造,但是還有一個(gè)造成Jank的原因也是不容忽視的,這就是雙buffer機(jī)制帶來(lái)的jank風(fēng)險(xiǎn)。
Triple Buffer:
如下圖,理想情況下的雙buffer是沒(méi)有問(wèn)題的,這個(gè)理想狀態(tài)是指繪制工作(可以粗略地理解為一幀CPU和GPU執(zhí)行的總耗時(shí))在一個(gè)VSync周期內(nèi)完成,這樣的情況下,不會(huì)發(fā)生jank。
遺憾的是,事情的發(fā)展不會(huì)總是按我們的預(yù)期來(lái)進(jìn)行的,如果繪制時(shí)長(zhǎng)超過(guò)了一個(gè)VSync周期,那么就必然會(huì)發(fā)生jank。如下圖所示,有兩幀的繪制超過(guò)了一個(gè)VSync周期,那么就會(huì)發(fā)生兩次Jank。
三Buffer機(jī)制實(shí)際上就是在上述backbuffer和frontbuffer的基礎(chǔ)上,再添加一塊buffer進(jìn)行輪轉(zhuǎn)。在這樣的情況下,同樣假設(shè)有兩幀的繪制就是大于一個(gè)VSync周期,那么只會(huì)造成一次Jank。
三buffer機(jī)制雖然能降低jank的概率,但是也會(huì)帶來(lái)Touch響應(yīng)慢和內(nèi)存消耗高的負(fù)面影響,只不過(guò)相對(duì)于它帶來(lái)的效果,這些負(fù)面影響被忽略了。
-
Android
+關(guān)注
關(guān)注
12文章
3973瀏覽量
130221 -
系統(tǒng)
+關(guān)注
關(guān)注
1文章
1032瀏覽量
21816
發(fā)布評(píng)論請(qǐng)先 登錄
DLPC7541是如何設(shè)定TSTP輸出Vsync訊號(hào)?
【Raspberry Pi 3申請(qǐng)】andriod系統(tǒng)中開(kāi)發(fā)APP
中智訊系列培訓(xùn)課程:Andriod事件、數(shù)據(jù)、網(wǎng)絡(luò)
如何駕駛所有五個(gè)R,G,B,HSYNC和VSYNC?
logcat如何查看Andriod log系統(tǒng)日志?
VSYNC、HSYNC、DOTCLOCK是如何計(jì)算的?
背景/蒙太奇,背景/蒙太奇是什么意思
Dragon?Board?410c板基于Andriod?5.1,
由Andriod Phone通過(guò)藍(lán)牙控制的機(jī)器人汽車

簡(jiǎn)述Vsync信號(hào)和View繪制流程之間的關(guān)系
VSync的起源是什么

VSync的虛擬化與同步

Andriod中VSync的分發(fā)

VSync offset定義的方法

評(píng)論