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