VSync的虛擬化
由上面的介紹可以知道,VSync其實起源于顯示屏,但是想想如果每個App和SurfaceFlinger都去從硬件驅(qū)動中直接監(jiān)聽VSync,那未免有點太復雜了,而且耦合性太高,不行。那怎么辦呢?
因此,最好是有一個模塊去專門跟驅(qū)動溝通,再由它將VSync信號廣播給大家,就像一個hub一樣。但是VSync頻率這么高,每次從kernel到userspace的消耗也不少,而且VSync是周期性的,很容易猜,所以沒必要一直從kernel監(jiān)聽,但是系統(tǒng)是一直需要VSync來控制繪制合成的,所以有必要搞一個虛擬的VSync來模擬硬件VSync了。大概架構(gòu)如下圖:
其中SurfaceFlinger中的DisplayVSync(Android S后改名為VsyncController)就是虛擬的VSync源,其需要兩個參數(shù)來保證與硬件VSync的同步性,第一是參考點,第二就是周期。這些都可以開啟硬件VSync同步解決。
VSync的同步
VSync虛擬化的實質(zhì)就是在軟件層面模擬硬件VSync,既然是軟件模擬,那么就會存在誤差,如果誤差比較大,那么就需要開啟硬件VSync同步來進行校準。那么就存在兩個問題,怎么發(fā)現(xiàn)自己誤差比較大?以及怎么來同步?
首先是如何發(fā)現(xiàn)誤差比較大?答案是通過fence機制。SurfaceFlinger在每一幀交給HWC的時候,同時都會從HWC那里得到此幀的PresentFence,它是在此幀開始刷新至屏幕的時候signal的。那驅(qū)動什么時候開始刷新一幀至屏幕呢,答案是屏幕VSync來的時候。所以這下就能串起來了。根據(jù)PresentFence的signal時間就可以知道真實的VSync時間,那么之后的事情就簡單了。
在HWComposer::presentAndGetReleaseFences中獲取PresentFence,
獲取到fence之后就會對齊進行監(jiān)測
一旦不準就開硬件VSync來進行校準,通常情況下接收六次硬件VSync就可以完成校準動作。
-
Android
+關(guān)注
關(guān)注
12文章
3973瀏覽量
130252 -
硬件
+關(guān)注
關(guān)注
11文章
3484瀏覽量
67503 -
監(jiān)測
+關(guān)注
關(guān)注
2文章
3982瀏覽量
45632
發(fā)布評論請先 登錄
什么是虛擬同步發(fā)電機?虛擬同步發(fā)電機有什么作用?
【資料分享】究竟什么是虛擬同步發(fā)電機??
什么是虛擬同步機
虛擬機及虛擬化技術(shù)
淺談云計算與虛擬化的關(guān)系及虛擬化的類型
華為宣布開源數(shù)據(jù)虛擬化openLooKeng
I/O軟件模擬虛擬化和類虛擬化
簡述Vsync信號和View繪制流程之間的關(guān)系
并網(wǎng)逆變器學習筆記之虛擬同步機控制(VSG)

虛擬化技術(shù)是什么 虛擬化技術(shù)介紹
VSync的起源是什么

Andriod中Vsync的背景

Andriod中VSync的分發(fā)

評論