VSync-offset/duration
虛擬化后的VSync還有一個好處,就是可以對VSync進行一些定制操作,offset就是其中之一。
接下來就是offset的定義,offset 分為兩大類,即phase-app和phase-sf:
phase-app:VSync-app與hw_vsync的相位差;
phase-sf:VSync-sf與hw_vsync的相位差;
還是以trace為例,可以看到,每一個vsync-app都比對應的TE信號晚了1.2ms,因此這份trace中的app-offset為+1200000(ns為單位)
同樣的,每一個vsync-sf都比對應的TE早了3.6ms,因此sf-offset即為-3600000.
綜上,offset表示著vsync-app及vsync-sf與hw_vsync的相位差,這個值通過dump sf就可以獲取。
Offset 的一個比較難以確定的點就在于 Offset 的時間該如何設置,其優缺點是動態的,與機型的性能和使用場景有很大的關系。
如果 Offset 配置過短,那么可能 App 收到 Vsync-App 后還沒有渲染完成,SurfaceFlinger 就收到 Vsync-SF開始合成,那么此時如果 App 的 BufferQueue 中沒有之前累積的 Buffer,那么 SurfaceFlinger 這次合成就不會有 App的東西在里面,需要等到下一個 Vsync-SF 才能合成這次 App 的內容,時間相當于變成了 Vsync 周期+Offset,而不是我們期待的Offset。
如果 Offset 配置過長,就沒有辦法起到其原有的作用了。
另外,稍微錯開app和sf的VSync是有好處的,因為錯開后整個系統同一時間搶占CPU的task會減少,理論上會有點優化。一般安卓對不同幀率有不同的offset默認配置。
在Android S及之后的版本,Google引入了duration的概念,部分程度上代替了offset。
duration的定義相對明確
app duration:app繪制一塊buffer到sf消費這塊buffer的時長(vsync-app與對應vsync-sf的間隔);
sf duration:sf消費一塊buffer到這塊buffer上屏的時長(vsync-sf到TE的間隔);
也就是說,app duration和sf duration之和,即為某一幀從開始繪制到刷新在屏幕上的總時長。
這種表示相對直觀,因此在S版本及之后,google默認采用配置duration的方式來決定vsync相位差,但這并不代表offset被棄用,這兩個值是相互影響的,修改其中一個值,另外一個值也會出現變化。具體的換算關系為
app phase=n * vsync period - (app duration + sf duration)
sf phase = m * vsync period - sf duration
從duration的概念可以看出,duration越短,給到app繪制和sf合成的時間就越有限,那么繪制線程和sf線程所需的CPU,GPU頻率就越高,功耗就越高。
duration的長短會影響一個buffer從繪制到上屏的生命周期,進而影響到跟手性,duration越短,跟手性越強。其次,duration的配置會影響bufferqueue里預先加載的buffer塊數量,進而影響sf占用的內存大小,duration越長,buffer塊數量越多,sf占用內存越大。另外,廠商對CPU和GPU的調頻策略也會受到duration的影響,貿然改短duration可能會導致特定場景的頻率異常升高。
講了這么多,總結起來Andriod中VSync模塊的架構就是下圖這樣:
HW_VSync是由屏幕產生的脈沖信號,用來控制屏幕的刷新。
VSync-app與VSync-sf統稱為軟件VSync,它們是由SurfaceFlinger通過模擬硬件VSync而產生的VSync信號量,再分發給app和sf用來控制它們的合成節奏。
-
Android
+關注
關注
12文章
3926瀏覽量
127158 -
軟件
+關注
關注
69文章
4799瀏覽量
87175 -
線程
+關注
關注
0文章
504瀏覽量
19653
發布評論請先 登錄
相關推薦
評論