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

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

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

Andriod中Vsync的背景

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

Android的顯示系統(tǒng)一直使用雙緩沖和VSync來防止屏幕畫面發(fā)生撕裂現(xiàn)象,這也是其他系統(tǒng)的常規(guī)操作。Android的不同之處是將VSync運用到繪制系統(tǒng)中,作為黃油計劃(Project Butter)的一部分,用以提升系統(tǒng)的流暢度。

VSync:

Android中VSync的作用是統(tǒng)一系統(tǒng)繪制與顯示節(jié)奏(Apps和SurfaceFlinger),大家各司其職,確保在VSync來的時候干活,這樣系統(tǒng)理論上就絲滑了。

如下圖,在沒有VSync的情況下,系統(tǒng)渲染的節(jié)奏與屏幕刷新的節(jié)奏不一致,如果某一幀系統(tǒng)渲染的比較晚,那么就會出現(xiàn)屏幕兩次刷新都顯示同一份內(nèi)容的情況,也就是Jank(掉幀)。

圖片

有了VSync的話,系統(tǒng)會在VSync到來時進行繪制,與屏幕的刷新節(jié)奏保持一致,這樣就大大降低了jank的概率。

圖片

那么問題來了,怎么讓Apps根據(jù)VSync的節(jié)奏來進行繪制呢?App依賴系統(tǒng)的繪制系統(tǒng),所以必須讓繪制系統(tǒng)聽命令才行,這就是Choreographer出現(xiàn)的原因。

Choreographer:

Choreographer(編舞者)的作用在源碼的注釋中已經(jīng)寫得很明白,是用來接收定時脈沖信號來控制繪制的模塊。也就是說,有了Choreographer,apps就能夠根據(jù)Vsync信號來進行周期性的繪制工作。

圖片

以上兩者配合就基本上完成了Android中VSync的改造,但是還有一個造成Jank的原因也是不容忽視的,這就是雙buffer機制帶來的jank風險。

Triple Buffer:

如下圖,理想情況下的雙buffer是沒有問題的,這個理想狀態(tài)是指繪制工作(可以粗略地理解為一幀CPUGPU執(zhí)行的總耗時)在一個VSync周期內(nèi)完成,這樣的情況下,不會發(fā)生jank。

圖片

遺憾的是,事情的發(fā)展不會總是按我們的預期來進行的,如果繪制時長超過了一個VSync周期,那么就必然會發(fā)生jank。如下圖所示,有兩幀的繪制超過了一個VSync周期,那么就會發(fā)生兩次Jank。

圖片

三Buffer機制實際上就是在上述backbuffer和frontbuffer的基礎上,再添加一塊buffer進行輪轉(zhuǎn)。在這樣的情況下,同樣假設有兩幀的繪制就是大于一個VSync周期,那么只會造成一次Jank。

圖片

三buffer機制雖然能降低jank的概率,但是也會帶來Touch響應慢和內(nèi)存消耗高的負面影響,只不過相對于它帶來的效果,這些負面影響被忽略了。

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

    關注

    12

    文章

    3909

    瀏覽量

    126933
  • 系統(tǒng)
    +關注

    關注

    1

    文章

    1006

    瀏覽量

    21277
收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

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

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

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

    logcat會輸出系統(tǒng)哪些信息呢?如何學習logcat命令?logcat如何查看Andriod log系統(tǒng)日志?如何查看Andriod log系統(tǒng)日志?
    發(fā)表于 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 是如何計算的?
    發(fā)表于 03-14 09:42

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

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

    背景/蒙太奇,背景/蒙太奇是什么意思

    背景/蒙太奇,背景/蒙太奇是什么意思 背景 畫面主體背后的景物。背景包括后景、遠景
    發(fā)表于 04-12 10:26 ?2013次閱讀

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

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

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

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

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

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

    VSync的起源是什么

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

    VSync的虛擬化與同步

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

    AndriodVSync的分發(fā)

    App與SurfaceFlinger是不同的進程,它們之間傳遞VSync的話涉及到進程間通信,而且VSync頻率很高,App很多,所以VSync的分發(fā)效率要很高才行。Linux進程間通信方式總共
    的頭像 發(fā)表于 11-21 16:32 ?751次閱讀
    <b class='flag-5'>Andriod</b><b class='flag-5'>中</b><b class='flag-5'>VSync</b>的分發(fā)

    VSync offset定義的方法

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