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

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

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

Andriod中VSync的分發(fā)

麥辣雞腿堡 ? 來(lái)源:OPPO內(nèi)核工匠 ? 作者:Phil ? 2023-11-21 16:32 ? 次閱讀

App與SurfaceFlinger是不同的進(jìn)程,它們之間傳遞VSync的話涉及到進(jìn)程間通信,而且VSync頻率很高,App很多,所以VSync的分發(fā)效率要很高才行。Linux進(jìn)程間通信方式總共就那么幾種,Android選擇了Domain Socket,應(yīng)該是因?yàn)槠涓咝?、?jiǎn)單、且有序吧,并將其封裝成了更易用的BitTube。

圖片

VSync-app/sf

Android繪制、顯示各個(gè)環(huán)節(jié)均是由VSync驅(qū)動(dòng),具體來(lái)說(shuō)就是App的每一幀的繪制是從收到VSync信號(hào)(VSync-app)開(kāi)始的,SurfaceFlinger合成當(dāng)前圖層也是從收到VSync信號(hào)(VSync-sf)開(kāi)始的。為了避免浪費(fèi),VSync的分發(fā)是按需的,即只有用戶需要(requestNextVsync)的時(shí)候,DisplayVSync才會(huì)給它發(fā)送VSync。

圖片

Vsync相關(guān)類簡(jiǎn)介

首先來(lái)介紹一些vsync相關(guān)的類,基本上所有vsync相關(guān)方法,都是實(shí)現(xiàn)在這三個(gè)類當(dāng)中的(以下代碼均為Anrdoid T版本源碼)。

VsyncTracker:其實(shí)際上是創(chuàng)建了一個(gè)VSyncPredictor對(duì)象,這個(gè)對(duì)象的作用是基于之前的VSync信號(hào)時(shí)間戳來(lái)預(yù)測(cè)未來(lái)VSync時(shí)間戳。也就是基于HWVsync來(lái)訓(xùn)練Vsync模型。從而能夠在HWVsync關(guān)閉的情況下依然能夠預(yù)測(cè)未來(lái)的VSync時(shí)間。

圖片

VsyncDispatcher:顧名思義,這個(gè)類是用來(lái)分發(fā)Vsync信號(hào)的。實(shí)際上最終創(chuàng)建了一個(gè)VSyncDispatchTimerQueue對(duì)象,負(fù)責(zé)分發(fā)vsync callback事件,需要接收Vsync事件的模塊可以通過(guò)registerCallback向其中注冊(cè)回調(diào),當(dāng)有Vsync事件發(fā)生時(shí)就會(huì)遍歷已注冊(cè)的回調(diào)分發(fā)Vsync。

圖片

VSyncController:最終方法的實(shí)現(xiàn)是在一個(gè)VSyncReactor對(duì)象中,從代碼中看,這個(gè)對(duì)象的主要作用是負(fù)責(zé)傳遞HWVsync,presentFence信號(hào)。

圖片

sf申請(qǐng)vsync

當(dāng)sf需要請(qǐng)求刷新時(shí),會(huì)調(diào)用MessageQueue中的scheduleFrame函數(shù)

圖片

進(jìn)而直接調(diào)用到VSyncCallbackRegistration中的schedule函數(shù),進(jìn)一步再到VSyncDispatchTimerQueue中的schedule函數(shù)。

圖片

圖片

這其中rearmTimerSkippingUpdateFor是一個(gè)比較關(guān)鍵的函數(shù),這個(gè)函數(shù)會(huì)拿到下次觸發(fā)vsync的時(shí)間戳,并通過(guò)setTimer函數(shù)向定時(shí)器設(shè)置這個(gè)時(shí)間戳,等到定時(shí)器被喚醒時(shí),觸發(fā)callback以發(fā)送vsync。

圖片圖片

下面我們來(lái)看callback是怎么被層層觸發(fā)的。

當(dāng)定時(shí)器到來(lái)時(shí),首先回調(diào)的是VSyncDispatchTimerQueue中的timerCallback函數(shù)

圖片

它持有的結(jié)構(gòu)體Invocation中持有一個(gè)VSyncDispatchTimerQueueEntry對(duì)象,進(jìn)一步追下去,可以知道這個(gè)mCallback最終調(diào)到的是MessageQueue中的VsyncCallback函數(shù)。

圖片圖片圖片

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

圖片

app申請(qǐng)vsync

相比于sf的申請(qǐng),app的申請(qǐng)就顯得要復(fù)雜一些。app通常是通過(guò)調(diào)用requestNextVsync這個(gè)binder接口來(lái)進(jìn)行vsync的申請(qǐng)。

圖片

這個(gè)接口會(huì)調(diào)用到eventthread中的requestNextVsync函數(shù),此函數(shù)會(huì)通過(guò)mCondition發(fā)送廣播。

圖片

當(dāng)threadMain監(jiān)聽(tīng)到廣播后,便會(huì)繼續(xù)執(zhí)行循環(huán)。

圖片

eventThread會(huì)執(zhí)行什么呢,關(guān)鍵性的函數(shù)就是dispSyncSource中的setVSyncEnabled函數(shù),當(dāng)傳入參數(shù)為true時(shí),會(huì)調(diào)用到CallbackRepeater中的start函數(shù)。

圖片圖片

繼續(xù)往下看,會(huì)調(diào)用到VSyncCallbackRegistration中的Schedule函數(shù),進(jìn)一步到VSyncDispatchTimerQueue中的schedule函數(shù)。

圖片圖片

下面的流程和sf申請(qǐng)vsync基本就是大同小異了,它回調(diào)的地方是這里

調(diào)用CallbackRepeater中的callback;

圖片

最終調(diào)用到DispSyncSource中的onVsyncCallback,這也就是我們?cè)趖race中看到的vsync-app跳變的地方啦。

圖片

相比于vsync-sf,vsync-app還多了一個(gè)向申請(qǐng)方發(fā)送vsync的過(guò)程。繼續(xù)往下看,調(diào)用到了EventThread中的onVSyncEvent,其會(huì)把VsyncEvent保存到mPendingEvents中。

圖片

那么這些event在哪里分發(fā)呢?答案是還在threadMain中,這個(gè)dispatchEvent函數(shù)就是用來(lái)負(fù)責(zé)向每個(gè)consumer分發(fā)vsync的。

圖片

說(shuō)到這里,大家肯定會(huì)有一個(gè)疑問(wèn),為什么vsync-app和vsync-sf都是由同一個(gè)定時(shí)器觸發(fā)的,但是最終回調(diào)的位置確不一樣呢?

答案是,這兩種vsync本身注冊(cè)回調(diào)的位置就不一樣。

vsync-sf是在messagequeue中注冊(cè)的

圖片

而vsync-app是在callbackRepeater中注冊(cè)的。

圖片

這也是google在Android T上才做出來(lái)的改動(dòng),究其原因,應(yīng)該是谷歌認(rèn)為應(yīng)該簡(jiǎn)化vsync-sf在內(nèi)部的傳遞流程,反正也是只給sf自己用的。

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

    關(guān)注

    12

    文章

    3903

    瀏覽量

    126612
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3218

    瀏覽量

    113676
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61965
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【Raspberry Pi 3申請(qǐng)】andriod系統(tǒng)開(kāi)發(fā)APP

    申請(qǐng)理由:公司項(xiàng)目前期測(cè)試項(xiàng)目描述:主要功能能夠?qū)崿F(xiàn)andriod系統(tǒng),在這個(gè)基礎(chǔ)之上開(kāi)發(fā)一些小的APP功能,通過(guò)有線網(wǎng)絡(luò)或者無(wú)線網(wǎng)絡(luò)與其他設(shè)備或者網(wǎng)頁(yè)進(jìn)行通信等等。
    發(fā)表于 04-05 13:50

    智訊系列培訓(xùn)課程:Andriod事件、數(shù)據(jù)、網(wǎng)絡(luò)

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

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

    嗨,所有,和諧圖形管理器的“顯示設(shè)置”選項(xiàng)卡上的每個(gè)按鈕的水平脈沖,垂直脈沖和數(shù)據(jù)啟用,說(shuō)“見(jiàn)/改變引腳”。按下按鈕顯示引腳表。我想我可以找到HSYNC,VSYNC,DE下的PMP部分,但沒(méi)有。我想
    發(fā)表于 09-29 16:04

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

    你好我打算在sp605實(shí)現(xiàn)sobel邊緣檢測(cè)(我有這個(gè)開(kāi)發(fā)板)我想去尋找簡(jiǎn)單的vga驅(qū)動(dòng)程序我可以將R,G,B和HSYNC連接到J55可用的四個(gè)I / O,但不能連接VGA所需的VSYNC,因?yàn)镴55只有四個(gè)I / O.請(qǐng)建
    發(fā)表于 10-29 08:13

    logcat如何查看Andriod log系統(tǒng)日志?

    logcat會(huì)輸出系統(tǒng)哪些信息呢?如何學(xué)習(xí)logcat命令?logcat如何查看Andriod log系統(tǒng)日志?如何查看Andriod log系統(tǒng)日志?
    發(fā)表于 03-03 06:15

    VSYNC、HSYNC、DOTCLOCK是如何計(jì)算的?

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

    三星手機(jī)andriod系統(tǒng)軟件

    三星手機(jī)andriod系統(tǒng)軟件
    發(fā)表于 01-14 14:58 ?18次下載

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

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

    區(qū)塊鏈分發(fā)平臺(tái)Huobi Info公測(cè)版已正式上線

    新加坡,火幣旗下區(qū)塊鏈行業(yè)內(nèi)容分發(fā)平臺(tái)——Huobi Info(火幣資訊)公測(cè)版全新上線,提供ios、andriod版本供用戶下載,可向媒體、機(jī)構(gòu)和個(gè)人用戶提供7×24小時(shí)區(qū)塊鏈信息服務(wù)。
    發(fā)表于 11-07 11:38 ?1w次閱讀

    Andriod Phone通過(guò)藍(lán)牙控制的機(jī)器人汽車

    電子發(fā)燒友網(wǎng)站提供《由Andriod Phone通過(guò)藍(lán)牙控制的機(jī)器人汽車.zip》資料免費(fèi)下載
    發(fā)表于 11-11 14:48 ?0次下載
    由<b class='flag-5'>Andriod</b> Phone通過(guò)藍(lán)牙控制的機(jī)器人汽車

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

    vsync是有兩個(gè)信號(hào)的, 一個(gè)是vsync-app用于生成當(dāng)前幀的數(shù)據(jù);(CPU計(jì)算和GPU渲染) 一個(gè)用于消費(fèi)數(shù)據(jù)(合成圖像到Display上,vsync-surface) 。
    的頭像 發(fā)表于 02-02 11:18 ?761次閱讀

    VSync的起源是什么

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

    AndriodVsync的背景

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

    VSync的虛擬化與同步

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

    VSync offset定義的方法

    ,可以看到,每一個(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
    的頭像 發(fā)表于 11-21 16:57 ?780次閱讀
    <b class='flag-5'>VSync</b> offset定義的方法