VSync信號(hào)
vsync是有兩個(gè)信號(hào)的,
一個(gè)是vsync-app用于生成當(dāng)前幀的數(shù)據(jù);(CPU計(jì)算和GPU渲染)
一個(gè)用于消費(fèi)數(shù)據(jù)(合成圖像到Display上,vsync-surface) 。
三緩沖機(jī)制:
?CPU緩存為了防止GPU計(jì)算超時(shí),提前生成數(shù)據(jù) GPU:將數(shù)據(jù)放到緩沖池防止屏幕渲染超時(shí)
?
一,vsync信號(hào)來(lái)源
vsync可以由底層HardWare提供經(jīng)由Display發(fā)送,當(dāng)?shù)讓親ardware不能提供時(shí)也會(huì)發(fā)送vsync信號(hào)到Display。vsync屏蔽了底層Hal,使得沒(méi)有Vsync的硬件也可以使用。
二,發(fā)送流程
HardWare到達(dá)Display之后,Display會(huì) 「將vsync信號(hào)分成兩個(gè)」 一個(gè)用于 「生成」 一個(gè)用于 「消費(fèi)」 的vsync信號(hào)。
「一個(gè)是vsync-app」 喚醒Chrographer做App的繪制操作(生成當(dāng)前幀數(shù)據(jù))
「一個(gè)是vsync-sf」 是SurfaceFliger使用,當(dāng)vsync信號(hào)來(lái)臨時(shí)進(jìn)行合成操作(要滿足消費(fèi)完上一幀數(shù)據(jù)的條件下)
三,偏移量
vsync每隔16ms發(fā)送一個(gè)。vsync會(huì)分成兩個(gè)信號(hào)發(fā)送。這就意味著只要這兩個(gè)信號(hào)在16ms之內(nèi)處理完數(shù)據(jù)就可以。也就是說(shuō)我們可以打亂順序是 「先合成消費(fèi)幀數(shù)據(jù)繪制到屏幕上」 還是先 「生成幀數(shù)據(jù)」 。
比如先發(fā)送vsync-app在0-13ms做完處理,接著13-16ms在發(fā)送vsync-surface合成數(shù)據(jù) 或者顛倒,但是事件一定保證只要在16ms之內(nèi)處理完這兩個(gè)信號(hào)即可
四,整個(gè)處理過(guò)程:
1.vsync-app:UI Thread準(zhǔn)備好繪制指令,提交給Render Thread渲染線程去調(diào)用OpenGl的函數(shù)去生成buffer并放到BufferQuene中
2.vsync-surface:SurfaceFliger進(jìn)程去BufferQuene中去取出buffer合成圖像顯示到屏幕Display中。
五,vsync-app 解釋
喚醒Chorgrapher去做處理生成當(dāng)前這一幀的數(shù)據(jù)。注意:有兩個(gè)線程共同合作完成繪制動(dòng)作:UIThread生成指令和RenderThread調(diào)用OpenGl庫(kù)生成Buffer放入到BufferQuene緩沖隊(duì)列中。 「UIThread」 :Choreographer.doFrame() 「RenderThread」 :DrawFrame
首先來(lái)講 「UIThread的Choreographer.doFrame」 方法:
1.按順序發(fā)送INPUT,ANIMATION,TRASVEL并處理他們各自的doFrame方法 先處理輸入事件在處理動(dòng)畫(huà),最后的TRASVEL會(huì)進(jìn)行調(diào)用到ViewRootImpl中的doTrasvel回調(diào),這個(gè)回調(diào)里面會(huì)進(jìn)行measure,layout和draw。
這里講下draw方法,進(jìn)行performDraw方法調(diào)用時(shí)會(huì)調(diào)用全局Surface(也就是activity)的lockCanvas方法。這個(gè)方法會(huì)在native層的Surface對(duì)象中鎖定一塊內(nèi)存區(qū)域返回值為canvas也就是這片在native層的Surface內(nèi)存空間中。接下來(lái)調(diào)用draw方法把這個(gè)canvas傳入到參數(shù)中,也就是我們?cè)赿raw方法中對(duì)canvas進(jìn)行的修改實(shí)質(zhì)上都是對(duì)這塊內(nèi)存區(qū)域的修改。最后draw方法調(diào)用完成后,會(huì)進(jìn)行釋放這塊內(nèi)存區(qū)域并交給RenderThread去處理渲染數(shù)據(jù)。(釋放的操作在native層對(duì)應(yīng)的處理是把這塊內(nèi)存區(qū)域變成一個(gè)Bitmap交由RenderThread去渲染)
?draw方法其實(shí)并沒(méi)有進(jìn)行真正的繪制,而是把繪制的內(nèi)容放入到了DisplayList中接著同步到RenderThread中。
?
繪制最終會(huì)調(diào)用到View.invalidate方法
2.RenderThread執(zhí)行的時(shí)候UIThread就可以釋放掉去做其他處理,接著RenerThread去取出DisplayList中的數(shù)據(jù)進(jìn)行處理生成frameBuffer給到Surface去做合成處理。具體流程:RenderThread會(huì)執(zhí)行一個(gè)DrawFrameTask的Task,里面核心方法是DrawFrame。通過(guò)OpenGl和一些庫(kù)將渲染數(shù)據(jù)通知給SurefaceFliger去做圖層合成。將渲染數(shù)據(jù)放入到阻塞隊(duì)列中
六,vsync-sf:
App端中RenderThread產(chǎn)生的FrameBuffer數(shù)據(jù)會(huì)在SurfaceFliger中進(jìn)行消費(fèi)。也就是取出阻塞隊(duì)列中的渲染數(shù)據(jù)。SurfaceFliger進(jìn)行合成到Display上面處理
-
cpu
+關(guān)注
關(guān)注
68文章
11080瀏覽量
217050 -
編程
+關(guān)注
關(guān)注
88文章
3689瀏覽量
95246 -
渲染
關(guān)注
0文章
76瀏覽量
11176
發(fā)布評(píng)論請(qǐng)先 登錄
plc教程之瀏覽FactoryTalk View Studio
自動(dòng)控制系統(tǒng)控制工程教程之信號(hào)流程圖的資料說(shuō)明

簡(jiǎn)述dtft和z變換之間的關(guān)系
Andriod中Vsync的背景

VSync的虛擬化與同步

Andriod中VSync的分發(fā)

VSync offset定義的方法

評(píng)論