<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

簡述Vsync信號和View繪制流程之間的關系

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

VSync信號

vsync是有兩個信號的,

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

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

三緩沖機制:

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

?

一,vsync信號來源

vsync可以由底層HardWare提供經由Display發送,當底層Hardware不能提供時也會發送vsync信號到Display。vsync屏蔽了底層Hal,使得沒有Vsync的硬件也可以使用。

二,發送流程

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

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

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

三,偏移量

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

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

四,整個處理過程:

1.vsync-app:UI Thread準備好繪制指令,提交給Render Thread渲染線程去調用OpenGl的函數去生成buffer并放到BufferQuene中

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

五,vsync-app 解釋

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

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

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

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

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

?

繪制最終會調用到View.invalidate方法

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

六,vsync-sf:

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10512

    瀏覽量

    207225
  • 編程
    +關注

    關注

    88

    文章

    3450

    瀏覽量

    92695
  • 渲染
    +關注

    關注

    0

    文章

    60

    瀏覽量

    10780
收藏 人收藏

    評論

    相關推薦

    plc教程之瀏覽FactoryTalk View Studio

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

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

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

    JAVA教程之不規則圖形的繪制

    JAVA教程之不規則圖形的繪制,很好的JAVA的資料,快來學習吧
    發表于 04-11 17:28 ?1次下載

    C#教程之繪制鼠標Cur

    C#教程之繪制鼠標Cur,很好的C#資料,快來學習吧。
    發表于 04-20 10:50 ?6次下載

    C#教程之繪制文字

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

    C#教程之繪制選中

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

    C#教程之繪制噪點

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

    C#教程之繪制直線

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

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

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

    跨職能流程圖怎么畫?教你輕松繪制泳道圖流程

    。1、水平布局跨職能流程圖幫助公司在業務流程進度上進行流程繪制,將不同部門負責的流程通過一條條線隔起來,又通過箭頭將有
    的頭像 發表于 07-28 11:23 ?1.6w次閱讀

    簡述dtft和z變換之間關系

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

    Andriod中Vsync的背景

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

    VSync的虛擬化與同步

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

    Andriod中VSync的分發

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

    VSync offset定義的方法

    為例,可以看到,每一個vsync-app都比對應的TE信號晚了1.2ms,因此這份trace中的app-offset為+1200000(ns為單位) 同樣的,每一個vsync-sf都比對應的TE早了3.6ms,因此sf-offs
    的頭像 發表于 11-21 16:57 ?509次閱讀
    <b class='flag-5'>VSync</b> offset定義的方法
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>