0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡述Vsync信號和View繪制流程之間的關(guān)系

jf_78858299 ? 來源:北洋洋洋 ? 作者:北洋 ? 2023-02-02 11:18 ? 次閱讀

VSync信號

vsync是有兩個信號的,

一個是vsync-app用于生成當(dāng)前幀的數(shù)據(jù);(CPU計算和GPU渲染)

一個用于消費數(shù)據(jù)(合成圖像到Display上,vsync-surface) 。

三緩沖機制:

?CPU緩存為了防止GPU計算超時,提前生成數(shù)據(jù) GPU:將數(shù)據(jù)放到緩沖池防止屏幕渲染超時

?

一,vsync信號來源

vsync可以由底層HardWare提供經(jīng)由Display發(fā)送,當(dāng)?shù)讓親ardware不能提供時也會發(fā)送vsync信號到Display。vsync屏蔽了底層Hal,使得沒有Vsync的硬件也可以使用。

二,發(fā)送流程

HardWare到達Display之后,Display會 「將vsync信號分成兩個」 一個用于 「生成」 一個用于 「消費」 的vsync信號。

「一個是vsync-app」 喚醒Chrographer做App的繪制操作(生成當(dāng)前幀數(shù)據(jù))

「一個是vsync-sf」 是SurfaceFliger使用,當(dāng)vsync信號來臨時進行合成操作(要滿足消費完上一幀數(shù)據(jù)的條件下)

三,偏移量

vsync每隔16ms發(fā)送一個。vsync會分成兩個信號發(fā)送。這就意味著只要這兩個信號在16ms之內(nèi)處理完數(shù)據(jù)就可以。也就是說我們可以打亂順序是 「先合成消費幀數(shù)據(jù)繪制到屏幕上」 還是先 「生成幀數(shù)據(jù)」 。

比如先發(fā)送vsync-app在0-13ms做完處理,接著13-16ms在發(fā)送vsync-surface合成數(shù)據(jù) 或者顛倒,但是事件一定保證只要在16ms之內(nèi)處理完這兩個信號即可

四,整個處理過程:

1.vsync-app:UI Thread準(zhǔn)備好繪制指令,提交給Render Thread渲染線程去調(diào)用OpenGl的函數(shù)去生成buffer并放到BufferQuene中

2.vsync-surface:SurfaceFliger進程去BufferQuene中去取出buffer合成圖像顯示到屏幕Display中。

五,vsync-app 解釋

喚醒Chorgrapher去做處理生成當(dāng)前這一幀的數(shù)據(jù)。注意:有兩個線程共同合作完成繪制動作:UIThread生成指令和RenderThread調(diào)用OpenGl庫生成Buffer放入到BufferQuene緩沖隊列中。 「UIThread」 :Choreographer.doFrame() 「RenderThread」 :DrawFrame

首先來講 「UIThread的Choreographer.doFrame」 方法:

1.按順序發(fā)送INPUT,ANIMATION,TRASVEL并處理他們各自的doFrame方法 先處理輸入事件在處理動畫,最后的TRASVEL會進行調(diào)用到ViewRootImpl中的doTrasvel回調(diào),這個回調(diào)里面會進行measure,layout和draw。

這里講下draw方法,進行performDraw方法調(diào)用時會調(diào)用全局Surface(也就是activity)的lockCanvas方法。這個方法會在native層的Surface對象中鎖定一塊內(nèi)存區(qū)域返回值為canvas也就是這片在native層的Surface內(nèi)存空間中。接下來調(diào)用draw方法把這個canvas傳入到參數(shù)中,也就是我們在draw方法中對canvas進行的修改實質(zhì)上都是對這塊內(nèi)存區(qū)域的修改。最后draw方法調(diào)用完成后,會進行釋放這塊內(nèi)存區(qū)域并交給RenderThread去處理渲染數(shù)據(jù)。(釋放的操作在native層對應(yīng)的處理是把這塊內(nèi)存區(qū)域變成一個Bitmap交由RenderThread去渲染)

?draw方法其實并沒有進行真正的繪制,而是把繪制的內(nèi)容放入到了DisplayList中接著同步到RenderThread中。

?

繪制最終會調(diào)用到View.invalidate方法

2.RenderThread執(zhí)行的時候UIThread就可以釋放掉去做其他處理,接著RenerThread去取出DisplayList中的數(shù)據(jù)進行處理生成frameBuffer給到Surface去做合成處理。具體流程:RenderThread會執(zhí)行一個DrawFrameTask的Task,里面核心方法是DrawFrame。通過OpenGl和一些庫將渲染數(shù)據(jù)通知給SurefaceFliger去做圖層合成。將渲染數(shù)據(jù)放入到阻塞隊列中

六,vsync-sf:

App端中RenderThread產(chǎn)生的FrameBuffer數(shù)據(jù)會在SurfaceFliger中進行消費。也就是取出阻塞隊列中的渲染數(shù)據(jù)。SurfaceFliger進行合成到Display上面處理

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10781

    瀏覽量

    210531
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3544

    瀏覽量

    93497
  • 渲染
    +關(guān)注

    關(guān)注

    0

    文章

    69

    瀏覽量

    10896
收藏 人收藏

    評論

    相關(guān)推薦

    plc教程之瀏覽FactoryTalk View Studio

    點擊“Samples Water”。plc視頻教程是比較宏觀的,里面包含的內(nèi)容很是龐大,plc教程之瀏覽FactoryTalk View Studio只是其中的很小的一部分更多內(nèi)容可以參看wxdongtian.cn網(wǎng)站的其他文章,或者購買全套的教程。
    發(fā)表于 09-18 08:45

    JAVA教程之常用圖形的繪制與填充

    JAVA教程之常用圖形的繪制與填充,很好的JAVA的資料,快來學(xué)習(xí)吧
    發(fā)表于 04-11 17:28 ?3次下載

    JAVA教程之不規(guī)則圖形的繪制

    JAVA教程之不規(guī)則圖形的繪制,很好的JAVA的資料,快來學(xué)習(xí)吧
    發(fā)表于 04-11 17:28 ?1次下載

    C#教程之繪制鼠標(biāo)Cur

    C#教程之繪制鼠標(biāo)Cur,很好的C#資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-20 10:50 ?6次下載

    C#教程之繪制文字

    C#教程之繪制文字,很好的C#資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-20 10:50 ?8次下載

    C#教程之繪制選中

    C#教程之繪制選中,很好的C#資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-20 10:50 ?10次下載

    C#教程之繪制噪點

    C#教程之繪制噪點,很好的C#資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-20 10:50 ?23次下載

    C#教程之繪制直線

    C#教程之繪制直線,很好的C#資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-20 10:50 ?6次下載

    C#教程之圖片上繪制文字

    C#教程之圖片上繪制文字,很好的C#資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-20 11:13 ?5次下載

    自動控制系統(tǒng)控制工程教程之信號流程圖的資料說明

    本文檔的主要內(nèi)容詳細介紹的是自動控制系統(tǒng)控制工程教程之信號流程圖的資料說明。系統(tǒng)方塊圖直觀表示系統(tǒng)輸入與輸出的關(guān)系,但簡化過程復(fù)雜。
    發(fā)表于 11-22 08:00 ?5次下載
    自動控制系統(tǒng)控制工程教<b class='flag-5'>程之</b><b class='flag-5'>信號</b><b class='flag-5'>流程</b>圖的資料說明

    簡述dtft和z變換之間關(guān)系

    簡述dtft和z變換之間關(guān)系 離散時間傅里葉變換(DTFT)和Z變換是兩種在信號處理中非常常見的變換方法。雖然兩種變換之間存在一些區(qū)別,但
    的頭像 發(fā)表于 09-07 16:38 ?3256次閱讀

    Andriod中Vsync的背景

    Android的顯示系統(tǒng)一直使用雙緩沖和VSync來防止屏幕畫面發(fā)生撕裂現(xiàn)象,這也是其他系統(tǒng)的常規(guī)操作。Android的不同之處是將VSync運用到繪制系統(tǒng)中,作為黃油計劃(Project
    的頭像 發(fā)表于 11-21 16:13 ?295次閱讀
    Andriod中<b class='flag-5'>Vsync</b>的背景

    VSync的虛擬化與同步

    。那怎么辦呢? 因此,最好是有一個模塊去專門跟驅(qū)動溝通,再由它將VSync信號廣播給大家,就像一個hub一樣。但是VSync頻率這么高,每次從kernel到userspace的消耗也不少,而且
    的頭像 發(fā)表于 11-21 16:23 ?600次閱讀
    <b class='flag-5'>VSync</b>的虛擬化與同步

    Andriod中VSync的分發(fā)

    VSync驅(qū)動,具體來說就是App的每一幀的繪制是從收到VSync信號VSync-app)開始的,SurfaceFlinger合成當(dāng)前圖層
    的頭像 發(fā)表于 11-21 16:32 ?751次閱讀
    Andriod中<b class='flag-5'>VSync</b>的分發(fā)

    VSync offset定義的方法

    ,可以看到,每一個vsync-app都比對應(yīng)的TE信號晚了1.2ms,因此這份trace中的app-offset為+1200000(ns為單位) 同樣的,每一個vsync-sf都比對應(yīng)的TE早了3.6ms,因此sf-offset
    的頭像 發(fā)表于 11-21 16:57 ?890次閱讀
    <b class='flag-5'>VSync</b> offset定義的方法