<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天內不再提示

Andriod中VSync的分發

麥辣雞腿堡 ? 來源:OPPO內核工匠 ? 作者:Phil ? 2023-11-21 16:32 ? 次閱讀

App與SurfaceFlinger是不同的進程,它們之間傳遞VSync的話涉及到進程間通信,而且VSync頻率很高,App很多,所以VSync的分發效率要很高才行。Linux進程間通信方式總共就那么幾種,Android選擇了Domain Socket,應該是因為其高效、簡單、且有序吧,并將其封裝成了更易用的BitTube。

圖片

VSync-app/sf

Android繪制、顯示各個環節均是由VSync驅動,具體來說就是App的每一幀的繪制是從收到VSync信號(VSync-app)開始的,SurfaceFlinger合成當前圖層也是從收到VSync信號(VSync-sf)開始的。為了避免浪費,VSync的分發是按需的,即只有用戶需要(requestNextVsync)的時候,DisplayVSync才會給它發送VSync。

圖片

Vsync相關類簡介

首先來介紹一些vsync相關的類,基本上所有vsync相關方法,都是實現在這三個類當中的(以下代碼均為Anrdoid T版本源碼)。

VsyncTracker:其實際上是創建了一個VSyncPredictor對象,這個對象的作用是基于之前的VSync信號時間戳來預測未來VSync時間戳。也就是基于HWVsync來訓練Vsync模型。從而能夠在HWVsync關閉的情況下依然能夠預測未來的VSync時間。

圖片

VsyncDispatcher:顧名思義,這個類是用來分發Vsync信號的。實際上最終創建了一個VSyncDispatchTimerQueue對象,負責分發vsync callback事件,需要接收Vsync事件的模塊可以通過registerCallback向其中注冊回調,當有Vsync事件發生時就會遍歷已注冊的回調分發Vsync。

圖片

VSyncController:最終方法的實現是在一個VSyncReactor對象中,從代碼中看,這個對象的主要作用是負責傳遞HWVsync,presentFence信號。

圖片

sf申請vsync

當sf需要請求刷新時,會調用MessageQueue中的scheduleFrame函數

圖片

進而直接調用到VSyncCallbackRegistration中的schedule函數,進一步再到VSyncDispatchTimerQueue中的schedule函數。

圖片

圖片

這其中rearmTimerSkippingUpdateFor是一個比較關鍵的函數,這個函數會拿到下次觸發vsync的時間戳,并通過setTimer函數向定時器設置這個時間戳,等到定時器被喚醒時,觸發callback以發送vsync。

圖片圖片

下面我們來看callback是怎么被層層觸發的。

當定時器到來時,首先回調的是VSyncDispatchTimerQueue中的timerCallback函數

圖片

它持有的結構體Invocation中持有一個VSyncDispatchTimerQueueEntry對象,進一步追下去,可以知道這個mCallback最終調到的是MessageQueue中的VsyncCallback函數。

圖片圖片圖片

最后的這個紅框的部分,就是我們通常在trace里看到的vsync-sf跳變的地方啦!

圖片

app申請vsync

相比于sf的申請,app的申請就顯得要復雜一些。app通常是通過調用requestNextVsync這個binder接口來進行vsync的申請。

圖片

這個接口會調用到eventthread中的requestNextVsync函數,此函數會通過mCondition發送廣播。

圖片

當threadMain監聽到廣播后,便會繼續執行循環。

圖片

eventThread會執行什么呢,關鍵性的函數就是dispSyncSource中的setVSyncEnabled函數,當傳入參數為true時,會調用到CallbackRepeater中的start函數。

圖片圖片

繼續往下看,會調用到VSyncCallbackRegistration中的Schedule函數,進一步到VSyncDispatchTimerQueue中的schedule函數。

圖片圖片

下面的流程和sf申請vsync基本就是大同小異了,它回調的地方是這里

調用CallbackRepeater中的callback;

圖片

最終調用到DispSyncSource中的onVsyncCallback,這也就是我們在trace中看到的vsync-app跳變的地方啦。

圖片

相比于vsync-sf,vsync-app還多了一個向申請方發送vsync的過程。繼續往下看,調用到了EventThread中的onVSyncEvent,其會把VsyncEvent保存到mPendingEvents中。

圖片

那么這些event在哪里分發呢?答案是還在threadMain中,這個dispatchEvent函數就是用來負責向每個consumer分發vsync的。

圖片

說到這里,大家肯定會有一個疑問,為什么vsync-app和vsync-sf都是由同一個定時器觸發的,但是最終回調的位置確不一樣呢?

答案是,這兩種vsync本身注冊回調的位置就不一樣。

vsync-sf是在messagequeue中注冊的

圖片

而vsync-app是在callbackRepeater中注冊的。

圖片

這也是google在Android T上才做出來的改動,究其原因,應該是谷歌認為應該簡化vsync-sf在內部的傳遞流程,反正也是只給sf自己用的。

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

    關注

    12

    文章

    3882

    瀏覽量

    126010
  • 定時器
    +關注

    關注

    23

    文章

    3156

    瀏覽量

    112533
  • 函數
    +關注

    關注

    3

    文章

    4117

    瀏覽量

    61507
收藏 人收藏

    評論

    相關推薦

    【Raspberry Pi 3申請】andriod系統開發APP

    申請理由:公司項目前期測試項目描述:主要功能能夠實現andriod系統,在這個基礎之上開發一些小的APP功能,通過有線網絡或者無線網絡與其他設備或者網頁進行通信等等。
    發表于 04-05 13:50

    智訊系列培訓課程:Andriod事件、數據、網絡

    現將智訊專業資料《Andriod事件、數據、網絡》分享給大家,僅供參考交流! 智訊(武漢)科技有限公司在移動互聯網、物聯網、嵌入式等技術領域有近十年的積累,專業為高校電子類、物聯網工程、嵌入式、軟件工程等高校院系提供實驗室設
    發表于 08-18 10:03

    如何在和聲圖形管理器設置HSYNC,VSYNC和DE的引腳?

    嗨,所有,和諧圖形管理器的“顯示設置”選項卡上的每個按鈕的水平脈沖,垂直脈沖和數據啟用,說“見/改變引腳”。按下按鈕顯示引腳表。我想我可以找到HSYNC,VSYNC,DE下的PMP部分,但沒有。我想
    發表于 09-29 16:04

    如何駕駛所有五個R,G,B,HSYNC和VSYNC?

    你好我打算在sp605實現sobel邊緣檢測(我有這個開發板)我想去尋找簡單的vga驅動程序我可以將R,G,B和HSYNC連接到J55可用的四個I / O,但不能連接VGA所需的VSYNC,因為J55只有四個I / O.請建
    發表于 10-29 08:13

    logcat如何查看Andriod log系統日志?

    logcat會輸出系統哪些信息呢?如何學習logcat命令?logcat如何查看Andriod log系統日志?如何查看Andriod log系統日志?
    發表于 03-03 06:15

    VSYNC、HSYNC、DOTCLOCK是如何計算的?

    與 LCDIFv2。 這是唯一的變化嗎-VIDEO_MUX->VID_MUX_CTRL.SET = VIDEO_MUX_VID_MUX_CTRL_PARA_LCD_SEL_MASK;VSYNC、HSYNC、DOTCLOCK 是如何計算的?
    發表于 03-14 09:42

    三星手機andriod系統軟件

    三星手機andriod系統軟件
    發表于 01-14 14:58 ?18次下載

    Dragon?Board?410c板基于Andriod?5.1,

    Dragon?Board?410c板基于Andriod?5.1,Linux,Windows10三種操作系統開發特點介紹,我上傳了很多相關資料,感興趣的可以去我上傳的資料里看看哈。
    發表于 06-30 15:03 ?4次下載

    區塊鏈分發平臺Huobi Info公測版已正式上線

    新加坡,火幣旗下區塊鏈行業內容分發平臺——Huobi Info(火幣資訊)公測版全新上線,提供ios、andriod版本供用戶下載,可向媒體、機構和個人用戶提供7×24小時區塊鏈信息服務。
    發表于 11-07 11:38 ?9299次閱讀

    Andriod Phone通過藍牙控制的機器人汽車

    電子發燒友網站提供《由Andriod Phone通過藍牙控制的機器人汽車.zip》資料免費下載
    發表于 11-11 14:48 ?0次下載
    由<b class='flag-5'>Andriod</b> Phone通過藍牙控制的機器人汽車

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

    vsync是有兩個信號的, 一個是vsync-app用于生成當前幀的數據;(CPU計算和GPU渲染) 一個用于消費數據(合成圖像到Display上,vsync-surface) 。
    的頭像 發表于 02-02 11:18 ?694次閱讀

    VSync的起源是什么

    VSync的起源 顯示屏上一幀畫面的顯示過程,是像素自上而下逐行掃描的過程,如果在上一幀的掃描還沒有結束的情況下,屏幕又開始掃描下一幀的像素,那么就會出現如下圖中撕裂(tearing)的情況。 這個
    的頭像 發表于 11-21 16:01 ?525次閱讀
    <b class='flag-5'>VSync</b>的起源是什么

    AndriodVsync的背景

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

    VSync的虛擬化與同步

    VSync的虛擬化 由上面的介紹可以知道,VSync其實起源于顯示屏,但是想想如果每個App和SurfaceFlinger都去從硬件驅動中直接監聽VSync,那未免有點太復雜了,而且耦合性太高,不行
    的頭像 發表于 11-21 16:23 ?346次閱讀
    <b class='flag-5'>VSync</b>的虛擬化與同步

    VSync offset定義的方法

    VSync-offset/duration 虛擬化后的VSync還有一個好處,就是可以對VSync進行一些定制操作,offset就是其中之一。 接下來就是offset的定義,offset 分為兩大類
    的頭像 發表于 11-21 16:57 ?538次閱讀
    <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>