VSync-offset/duration
虛擬化后的VSync還有一個(gè)好處,就是可以對(duì)VSync進(jìn)行一些定制操作,offset就是其中之一。
接下來(lái)就是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è)值通過(guò)dump sf就可以獲取。
Offset 的一個(gè)比較難以確定的點(diǎn)就在于 Offset 的時(shí)間該如何設(shè)置,其優(yōu)缺點(diǎn)是動(dòng)態(tài)的,與機(jī)型的性能和使用場(chǎng)景有很大的關(guān)系。
如果 Offset 配置過(guò)短,那么可能 App 收到 Vsync-App 后還沒(méi)有渲染完成,SurfaceFlinger 就收到 Vsync-SF開(kāi)始合成,那么此時(shí)如果 App 的 BufferQueue 中沒(méi)有之前累積的 Buffer,那么 SurfaceFlinger 這次合成就不會(huì)有 App的東西在里面,需要等到下一個(gè) Vsync-SF 才能合成這次 App 的內(nèi)容,時(shí)間相當(dāng)于變成了 Vsync 周期+Offset,而不是我們期待的Offset。
如果 Offset 配置過(guò)長(zhǎng),就沒(méi)有辦法起到其原有的作用了。
另外,稍微錯(cuò)開(kāi)app和sf的VSync是有好處的,因?yàn)殄e(cuò)開(kāi)后整個(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í)長(zhǎng)(vsync-app與對(duì)應(yīng)vsync-sf的間隔);
sf duration:sf消費(fèi)一塊buffer到這塊buffer上屏的時(shí)長(zhǎng)(vsync-sf到TE的間隔);
也就是說(shuō),app duration和sf duration之和,即為某一幀從開(kāi)始繪制到刷新在屏幕上的總時(shí)長(zhǎng)。
這種表示相對(duì)直觀,因此在S版本及之后,google默認(rèn)采用配置duration的方式來(lái)決定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的長(zhǎng)短會(huì)影響一個(gè)buffer從繪制到上屏的生命周期,進(jìn)而影響到跟手性,duration越短,跟手性越強(qiáng)。其次,duration的配置會(huì)影響bufferqueue里預(yù)先加載的buffer塊數(shù)量,進(jìn)而影響sf占用的內(nèi)存大小,duration越長(zhǎng),buffer塊數(shù)量越多,sf占用內(nèi)存越大。另外,廠商對(duì)CPU和GPU的調(diào)頻策略也會(huì)受到duration的影響,貿(mào)然改短duration可能會(huì)導(dǎo)致特定場(chǎng)景的頻率異常升高。
講了這么多,總結(jié)起來(lái)Andriod中VSync模塊的架構(gòu)就是下圖這樣:
HW_VSync是由屏幕產(chǎn)生的脈沖信號(hào),用來(lái)控制屏幕的刷新。
VSync-app與VSync-sf統(tǒng)稱為軟件VSync,它們是由SurfaceFlinger通過(guò)模擬硬件VSync而產(chǎn)生的VSync信號(hào)量,再分發(fā)給app和sf用來(lái)控制它們的合成節(jié)奏。
-
Android
+關(guān)注
關(guān)注
12文章
3958瀏覽量
129077 -
軟件
+關(guān)注
關(guān)注
69文章
5080瀏覽量
88698 -
線程
+關(guān)注
關(guān)注
0文章
507瀏覽量
19990
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
AD698里面的Gain Error、Output Offset和PSRR Gain等參數(shù)是如何定義的?
DLPC7541是如何設(shè)定TSTP輸出Vsync訊號(hào)?
FPGA時(shí)序約束OFFSET
OFFSET約束問(wèn)題
請(qǐng)問(wèn)設(shè)置OFFSET的約束定義是什么?
VSYNC、HSYNC、DOTCLOCK是如何計(jì)算的?
CDMA Access pn offset與距離的公式測(cè)定
Timing Groups and OFFSET Const
DC Offset Auto-Calibration of
OFFSET約束的寫(xiě)法(OFFSET IN和OFFSET OUT)

簡(jiǎn)述Vsync信號(hào)和View繪制流程之間的關(guān)系
VSync的起源是什么

Andriod中Vsync的背景

VSync的虛擬化與同步

Andriod中VSync的分發(fā)

評(píng)論