VSync的虛擬化
由上面的介紹可以知道,VSync其實起源于顯示屏,但是想想如果每個App和SurfaceFlinger都去從硬件驅動中直接監聽VSync,那未免有點太復雜了,而且耦合性太高,不行。那怎么辦呢?
因此,最好是有一個模塊去專門跟驅動溝通,再由它將VSync信號廣播給大家,就像一個hub一樣。但是VSync頻率這么高,每次從kernel到userspace的消耗也不少,而且VSync是周期性的,很容易猜,所以沒必要一直從kernel監聽,但是系統是一直需要VSync來控制繪制合成的,所以有必要搞一個虛擬的VSync來模擬硬件VSync了。大概架構如下圖:
其中SurfaceFlinger中的DisplayVSync(Android S后改名為VsyncController)就是虛擬的VSync源,其需要兩個參數來保證與硬件VSync的同步性,第一是參考點,第二就是周期。這些都可以開啟硬件VSync同步解決。
VSync的同步
VSync虛擬化的實質就是在軟件層面模擬硬件VSync,既然是軟件模擬,那么就會存在誤差,如果誤差比較大,那么就需要開啟硬件VSync同步來進行校準。那么就存在兩個問題,怎么發現自己誤差比較大?以及怎么來同步?
首先是如何發現誤差比較大?答案是通過fence機制。SurfaceFlinger在每一幀交給HWC的時候,同時都會從HWC那里得到此幀的PresentFence,它是在此幀開始刷新至屏幕的時候signal的。那驅動什么時候開始刷新一幀至屏幕呢,答案是屏幕VSync來的時候。所以這下就能串起來了。根據PresentFence的signal時間就可以知道真實的VSync時間,那么之后的事情就簡單了。
在HWComposer::presentAndGetReleaseFences中獲取PresentFence,
獲取到fence之后就會對齊進行監測
一旦不準就開硬件VSync來進行校準,通常情況下接收六次硬件VSync就可以完成校準動作。
-
Android
+關注
關注
12文章
3880瀏覽量
125891 -
硬件
+關注
關注
11文章
2952瀏覽量
65107 -
監測
+關注
關注
2文章
3139瀏覽量
43995
發布評論請先 登錄
相關推薦
虛擬化故障怎么辦?虛擬化運維怎么解決?
【資料分享】究竟什么是虛擬同步發電機??
什么是虛擬同步機
什么是計算機虛擬化
ARM系列虛擬化資料分享
VSYNC、HSYNC、DOTCLOCK是如何計算的?
簡述Vsync信號和View繪制流程之間的關系
并網逆變器學習筆記之虛擬同步機控制(VSG)
![并網逆變器學習筆記之<b class='flag-5'>虛擬</b><b class='flag-5'>同步</b>機控制(VSG)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
VSync的起源是什么
![<b class='flag-5'>VSync</b>的起源是什么](https://file1.elecfans.com/web2/M00/AF/E0/wKgaomVcY5qAPR00AAALkrEBrPo060.jpg)
Andriod中Vsync的背景
![Andriod中<b class='flag-5'>Vsync</b>的背景](https://file1.elecfans.com/web2/M00/B1/A5/wKgZomVcY_6Adv55AAHRJXVruK4208.jpg)
Andriod中VSync的分發
![Andriod中<b class='flag-5'>VSync</b>的分發](https://file1.elecfans.com/web2/M00/AF/E3/wKgaomVcaU-ADZS8AAAMk6egSf0779.jpg)
VSync offset定義的方法
![<b class='flag-5'>VSync</b> offset定義的方法](https://file1.elecfans.com/web2/M00/AF/E3/wKgaomVcaweAVppaAABBsCFjiiE498.jpg)
評論