Android的顯示系統(tǒng)一直使用雙緩沖和VSync來防止屏幕畫面發(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來的時(shí)候干活,這樣系統(tǒng)理論上就絲滑了。
如下圖,在沒有VSync的情況下,系統(tǒng)渲染的節(jié)奏與屏幕刷新的節(jié)奏不一致,如果某一幀系統(tǒng)渲染的比較晚,那么就會出現(xiàn)屏幕兩次刷新都顯示同一份內(nèi)容的情況,也就是Jank(掉幀)。

有了VSync的話,系統(tǒng)會在VSync到來時(shí)進(jìn)行繪制,與屏幕的刷新節(jié)奏保持一致,這樣就大大降低了jank的概率。

那么問題來了,怎么讓Apps根據(jù)VSync的節(jié)奏來進(jìn)行繪制呢?App依賴系統(tǒng)的繪制系統(tǒng),所以必須讓繪制系統(tǒng)聽命令才行,這就是Choreographer出現(xiàn)的原因。
Choreographer:
Choreographer(編舞者)的作用在源碼的注釋中已經(jīng)寫得很明白,是用來接收定時(shí)脈沖信號來控制繪制的模塊。也就是說,有了Choreographer,apps就能夠根據(jù)Vsync信號來進(jìn)行周期性的繪制工作。

以上兩者配合就基本上完成了Android中VSync的改造,但是還有一個(gè)造成Jank的原因也是不容忽視的,這就是雙buffer機(jī)制帶來的jank風(fēng)險(xiǎn)。
Triple Buffer:
如下圖,理想情況下的雙buffer是沒有問題的,這個(gè)理想狀態(tài)是指繪制工作(可以粗略地理解為一幀CPU和GPU執(zhí)行的總耗時(shí))在一個(gè)VSync周期內(nèi)完成,這樣的情況下,不會發(fā)生jank。

遺憾的是,事情的發(fā)展不會總是按我們的預(yù)期來進(jìn)行的,如果繪制時(shí)長超過了一個(gè)VSync周期,那么就必然會發(fā)生jank。如下圖所示,有兩幀的繪制超過了一個(gè)VSync周期,那么就會發(fā)生兩次Jank。

三Buffer機(jī)制實(shí)際上就是在上述backbuffer和frontbuffer的基礎(chǔ)上,再添加一塊buffer進(jìn)行輪轉(zhuǎn)。在這樣的情況下,同樣假設(shè)有兩幀的繪制就是大于一個(gè)VSync周期,那么只會造成一次Jank。

三buffer機(jī)制雖然能降低jank的概率,但是也會帶來Touch響應(yīng)慢和內(nèi)存消耗高的負(fù)面影響,只不過相對于它帶來的效果,這些負(fù)面影響被忽略了。
-
Android
+關(guān)注
關(guān)注
12文章
3983瀏覽量
132959 -
系統(tǒng)
+關(guān)注
關(guān)注
1文章
1043瀏覽量
22163
發(fā)布評論請先 登錄
DLPC7541是如何設(shè)定TSTP輸出Vsync訊號?
【Raspberry Pi 3申請】andriod系統(tǒng)中開發(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通過藍(lán)牙控制的機(jī)器人汽車
簡述Vsync信號和View繪制流程之間的關(guān)系
VSync的起源是什么
VSync的虛擬化與同步
Andriod中VSync的分發(fā)
VSync offset定義的方法

Andriod中Vsync的背景
評論