Android性能:SurfaceFlinger與BufferQueue(3)

Android性能:SurfaceFlinger與BufferQueue(3)

Android顯示系統的組成可以概括為兩大部分:繪制(DrawFrame)+合成(SurfaceFlinger + HWC)
繪制:Surface中空的 GraphicBuffer->CPU或者GPU通過Canvas->將數據Draw到Surface。
合成:幾塊有數據的Buffer->疊合成一張Buffer->顯示。
BufferQueue:android系統中每一張顯示的圖片都是GraphicBuffer,通過BufferQueue在不同進程間流動。SurfaceFlinger是Android渲染核心進程,應用的渲染最終都會來到SurfaceFlinger進行處理,最終會把處理后的圖像數據交給CPU或者GPU進行繪制。
VYSNC:控制系統繪制與合成的節奏,按什么樣的間隔出幀,也就是幀率。
● VSYNC-app 是app控制繪制幀率,Choregrapher,響應VSYNC-app。
● VSYNC-sf 是SurfaceFlinger控制合成過程的幀率的
● VSYNC-app/sf 通常這兩者之間不會同時開始,會有一些offset。

BufferTx

DrawFrame里queueBuffer以后BufferTx會增加,SF起來響應拿走Buffer合成時會減少; BufferTx內有可用Buffer,SF才會真正去合成。
SF主進程結束點附近有數字對應到waiting for presentFence
● presentFence: 結束點代表SF送來的這一幀被顯示到了屏幕上,并signal前一幀的Fence。
● OverlayEngine: HWC的主要進程,Trigger display driver做顯示動作。

VSYNC和Fence相輔相成,
VSYNC:表示什么時間開始做事(繪制/合成)
Fence: 表示什么時間事情做完了(屏幕顯示)

BufferQueue 作為共享資源,連接 Surface 和 SurfaceFlinger。其中,Surface 是資源生產者,SurfaceFlinger 是資源消費者。
BufferQueue 有四個核心操作:
dequeueBuffer:向 BufferQueue 申請一塊空閑緩沖區(主流最大緩沖區數量為 64 個,之前為 32 個,通常設置為 2 個或者 3 個,即黃油計劃中的雙緩沖和三緩沖機制),發起方為生產者(Surface)。之前已經申請過的緩沖區可以被復用,如果不符合要求(比如還沒有申請過,緩沖區參數不匹配等)則需要重新申請新的緩沖區。
queueBuffer:向 BufferQueue 插入一塊填充了有效數據的緩沖區,發起方為生產者(Surface)。
acquireBuffer:從 BufferQueue 摘取一塊填充了有效數據的緩沖區用于合成或顯示消費,發起方為消費者(SurfaceFlinger)。
releaseBuffer:將消費完畢的緩沖區釋放,并送回 BufferQueue,發起方為消費者。(SurfaceFlinger)。
緩沖隊列中的每一塊緩沖區也有四個核心狀態:
FREE:初始狀態,或者已被消費者 release,持有者為 BufferQueue,只能用于 dequeue 操作,可被 Surface 訪問。
DEQUEUED:表示該塊緩沖區已被生產者 dequeue,持有者為 Surface,只能用于 queue 操作,可被 Surface 訪問。
QUEUED:表示該塊緩沖區已經被生產者 queue,持有者為 BufferQueue,只能用于 acquire 操作,可被 SurfaceFlinger 訪問。
ACQUIRED:表示該塊緩沖區已經被消費者 aquire,持有者為 SurfaceFlinger,只能用于 release 操作,可被 SurfaceFlinger 訪問。
生產者(Surface)、BufferQueue、消費者(SurfaceFlinger)三者之間的通信過程和緩沖區狀態遷移:

層次圖:

交互結構:

HWComposer是 SurfaceFlinger 用于與 HWC HAL 進行交互的代理。

SurfaceFlinger 合成的流程:
1 HWC 觸發 vsync 信號:vsync 信號將以回調的方式通知 SurfaceFlinger,SurfaceFlinger 收到 vsync 回調后開始執行下一幀的合成。
2 SurfaceFlinger 更新圖層:SurfaceFlinger 遍歷各個有效圖層,從其對應的 BufferQueue 中獲取最新的單元窗口繪制數據,以對圖層進行更新。這一步的 BufferQueue 中的緩沖區來自于預分配內存。
3 HWC :SurfaceFlinger 更新并準備好所有圖層后,將圖層參數告知 HWC HAL,HWC HAL 決定哪些圖層可以執行 Device合成。
4 SurfaceFlinger 執行 Client合成:如果有 HWC 不能處理的圖層,SurfaceFlinger 統一將它們交給 OpenGL 執行合成,其合成的數據作為一個普通合成窗口也插入到其對應的 BufferQueue 中,同時 SurfaceFlinger 還充當該 BufferQueue 的消費者將普通合成窗口取出并作為一個新的合成圖層與其它普通圖層一起準備交與 HWC 進行 Device合成。這一步 BufferQueue 中的緩沖區來自于 framebuffer,也就是說 Client合成數據已經直接 post 到 framebuffer 中。
5 HWC 執行 Device合成:HWC 將其余的圖層連同 Client合成圖層一起進行 Device合成。
6 HWC 將合成的幀 post 到 framebuffer 顯示:要將幀顯示出來,最終還是要將其 post 到 framebuffer 的 frontbuffer 中,這樣顯示控制器(display controller)才能從 framebuffer 中讀取幀數據進行掃描/最終顯示。

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer與fence機制(2)-CSDN博客文章瀏覽閱讀643次,點贊11次,收藏15次。t 時長,20s,20秒的trace文件。CPU返回后,會直接將GraphicBuffer提交給SurfaceFlinger,告訴SurfaceFlinger進行合成,但是這個時候GPU可能并未完成之前的圖像渲染,這時候就牽扯到一個同步,Android中,用的是Fence機制,SurfaceFlinger合成前會查詢Fence,如果GPU渲染沒有結束,則等待GPU渲染結束,GPU結束后,會通知SurfaceFlinger進行合成,SF合成后,提交顯示,最終完成圖像的渲染顯示。就是 Buffer。https://blog.csdn.net/zhangphil/article/details/138628225

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer與fence機制(2)-CSDN博客文章瀏覽閱讀317次,點贊8次,收藏10次。t 時長,20s,20秒的trace文件。CPU返回后,會直接將GraphicBuffer提交給SurfaceFlinger,告訴SurfaceFlinger進行合成,但是這個時候GPU可能并未完成之前的圖像渲染,這時候就牽扯到一個同步,Android中,用的是Fence機制,SurfaceFlinger合成前會查詢Fence,如果GPU渲染沒有結束,則等待GPU渲染結束,GPU結束后,會通知SurfaceFlinger進行合成,SF合成后,提交顯示,最終完成圖像的渲染顯示。就是 Buffer。https://blog.csdn.net/zhangphil/article/details/138628225Android adb shell命令捕獲systemtrace_android 抓trace-CSDN博客文章瀏覽閱讀1.7k次,點贊2次,收藏5次。Android ADB調試真機設備Android ADB(Andorid Debug Bridge),是Android開發中有用的測試和調試工具。使用Android ADB調試設備,直接在Windows的dos命令窗口輸入命名adb即可,如圖:為什么執行adb命令后是這樣?Android ADB(Andorid Debug Bridge)調試真機設備_adb在線執行器_zhangphil的博客-CSDN博客。-t 時長,20s,20秒的trace文件。-o 保存文件路徑。_android 抓tracehttps://blog.csdn.net/zhangphil/article/details/131249820卡頓丟幀分析adb shell命令-CSDN博客文章瀏覽閱讀207次,點贊3次,收藏3次。Android ADB調試真機設備Android ADB(Andorid Debug Bridge),是Android開發中有用的測試和調試工具。使用Android ADB調試設備,直接在Windows的dos命令窗口輸入命名adb即可,如圖:為什么執行adb命令后是這樣?Android ADB(Andorid Debug Bridge)調試真機設備_adb在線執行器_zhangphil的博客-CSDN博客。-t 時長,20s,20秒的trace文件。https://blog.csdn.net/zhangphil/article/details/137919380

Android GPU渲染屏幕繪制顯示基礎概念(1)-CSDN博客文章瀏覽閱讀705次,點贊20次,收藏12次。CPU返回后,會直接將GraphicBuffer提交給SurfaceFlinger,告訴SurfaceFlinger進行合成,但是這個時候GPU可能并未完成之前的圖像渲染,這時候就牽扯到一個同步,Android中,用的是Fence機制,SurfaceFlinger合成前會查詢Fence,如果GPU渲染沒有結束,則等待GPU渲染結束,GPU結束后,會通知SurfaceFlinger進行合成,SF合成后,提交顯示,最終完成圖像的渲染顯示。而對SF來說,只要有合成任務,它就得再去申請VSYNC-sf。https://blog.csdn.net/zhangphil/article/details/138585120Android性能:Double Buffer雙緩沖/Triple Buffer三緩沖丟幀Jank與無丟幀No Jank-CSDN博客文章瀏覽閱讀860次,點贊6次,收藏13次。Android ADB調試真機設備Android ADB(Andorid Debug Bridge),是Android開發中有用的測試和調試工具。使用Android ADB調試設備,直接在Windows的dos命令窗口輸入命名adb即可,如圖:為什么執行adb命令后是這樣?_android 抓trace。三Buffer輪轉情況下,基本不會有這種情況的發生,渲染線程一般在 dequeueBuffer 時,都可以順利拿到可用的 Buffer (如果 dequeueBuffer 本身耗時那就也會拉長時間)。https://blog.csdn.net/zhangphil/article/details/138213964

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/12579.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12579.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12579.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python GUI開發- Qt Designer環境搭建

前言 Qt Designer是PyQt5 程序UI界面的實現工具,使用 Qt Designer 可以拖拽、點擊完成GUI界面設計,并且設計完成的 .ui 程序可以轉換成 .py 文件供 python 程序調用 環境準備 使用pip安裝 pip install pyqt5-toolsQt Designer 環境搭建 在pip安裝包…

Vue 常見通信

Vue 常見通信 1、父子通信 父傳子 props,子傳父 events($emit); 通過父鏈 / 子鏈 通信$parent / $children; $refs獲取ref 可以訪問組件實例方法,; 提供與注射provide / inject a t t r s …

使用Processing和PixelFlow庫創建交互式流體太極動畫

使用Processing和PixelFlow庫創建交互式流體太極動畫 引言準備工作效果展示代碼結構代碼解析第一部分:導入庫和設置基本參數第二部分:流體類定義MyFluidDataConfig 類詳解MyFluidData 類詳解my_update 方法詳解流體類定義完整代碼 第三部分:太…

找數字-算法

解法一、數位模擬 比n大的最小數就是n1,當n1時,以下幾種情況會導致n中1的個數發生變化(或者不變) 1.n的低位連續1的個數count>1,如1011,10111,1111等,加1后使得n中1的個數減少count-1個 解…

基于SVPWM的飛輪控制系統的simulink建模與仿真

目錄 1.課題概述 2.系統仿真結果 3.核心程序與模型 4.系統原理簡介 5.完整工程文件 1.課題概述 基于SVPWM的飛輪控制系統的simulink建模與仿真。SVPWM的核心思想是將逆變器輸出的三相電壓矢量在兩相靜止坐標系(αβ坐標系)中表示,通過控…

Python3 數據類型詳解:掌握數據基石,編寫高效程序

Python3 中的基本數據類型包括整數(int)、浮點數(float)、布爾值(bool)、字符串(str)、列表(list)、元組(tuple)、集合(se…

JAVA static注入 Util使用之Service注入

一般在Util等靜態方法中調用Service或mapper,初始化后會出現空指針異常:java.lang.NullPointerException。 代碼執行優先級的問題,在一個Java類中,存在著靜態代碼塊,靜態方法,構造函數,成員方法等等。不同…

golang中的類和接口

類 在 Go 語言中并沒有類的概念,而是使用結構體來實現面向對象的特性。通過 type 關鍵字可以定義自定義類型,包括結構體類型。下面是一個簡單的示例: package mainimport "fmt"// 定義一個結構體類型 type Person struct {Name s…

只對外公開必要的信息和步驟

隱藏內部結構 使對象的內部結構對外部不可見的內容的處理被稱為封裝化。只公開方法等使用者所需要的最低限度的接口,使用者只能通過外部接口進行訪問。如此一來,使用該類的程序就無須知道其內部的具體實現。 通過封裝化,不僅可以防止調用者…

Node.js安裝及環境配置(超詳細!保姆級!!)

目錄 一、進入官網地址下載安裝包 二、安裝程序 三、環境配置 四、測試 五、安裝淘寶鏡像 一、進入官網地址下載安裝包 Node.js — Download Node.js (nodejs.org) 選擇對應你系統的 node.js 版本,我選擇的是Windows系統,64位 點擊圖中選項&#…

無人機+應急通信:災害現場應急通信車技術詳解

無人機和應急通信車是災害現場應急通信中的重要技術。無人機可以通過快速到達災害現場,搭載高清攝像頭、紅外熱成像儀、激光雷達等設備,對災區進行實時監測和災情評估,同時也可以通過搭載的通信設備,與指揮中心進行實時通信和數據…

APP逆向實現方式總覽

方式一:硬核分析 梳理出參數的構造邏輯,代碼還原算法 方式二:模擬執行 2.1 Frida-RPC 電腦調用已加載到手機內存中的方法,直接獲取到結果 2.2 AndServer-RPC 安卓程序調用手機中的方法,最后暴露成HTTP服務供電腦…

?什么是排他鎖、共享鎖、意向鎖

共享鎖 共享鎖,又被稱為讀鎖,是由讀取操作所創建的一種鎖。在此期間,其他用戶可以同時讀取數據,但在數據上未釋放所有共享鎖之前,任何事務均無法對其進行修改(即獲取數據的排他鎖)。 一旦事務…

202009青少年軟件編程(Python)等級考試試卷(三級)

第 1 題 【單選題】 通過算式123122021120可將二進制1101 轉為十進制,下列進制轉換結果正確的是?( ) A :0b10轉為十進制,結果是2 B :0d10轉為十進制,結果是8 C :0x10轉為十進制,結果是10 D :0o10轉為十進制,結果是16 正確答案:A 試題解析: 第 2 題 【單選題】 語句flo…

基于Nios-II實現流水燈

文章目錄 一、新建項目1、選擇芯片2、Qsys設計2.1、點擊Platform Designer2.2配置軟核2.3其他設置 3、Quartus設計3.1添加原理圖3.2添加qip文件3.3其他設置3.4驅動設置 4、Nios-II Eslipse設計參考 一、新建項目 使用的Quartus 18.0及以上版本 1、選擇芯片 2、Qsys設計 2.1、點…

【AIGC調研系列】你好-GPT-4o

GPT-4o是OpenAI最新發布的一款人工智能模型,它具備處理和生成文本、音頻和圖像的能力。這個模型的特點是能夠實時對這些不同類型的輸入進行推理和響應,這使得它在多模態交互方面表現出色[1][2][3]。 GPT-4o的“o”代表“omni”,意味著它是一…

【復試分數線】綜合性985歷年分數線匯總(第四彈)

國家線和34所自劃線 可以看作是考研上岸最最最基礎的門檻。真正決定你能不能進入復試的還要看院線(復試分數線)!今天我將分析考信號的除C9、工科類985的其他7所985近三年復試分數線(不包括2024),大家可以參…

Azure IoT Hub是啥

1.概要說明 Azure IoT Hub是微軟在物聯網(IoT)領域提供的一款重要產品,為設備連接和管理提供了專業的解決方案。以下是關于Azure IoT Hub的詳細介紹: 定義:Azure IoT Hub是一個專為連接和管理數百萬臺物聯網設備而設計…

flutter開發實戰-人臉識別相機使用

flutter開發實戰-人臉識別相機使用 當需要拍攝的時候,需要檢測到人臉再進行后續的操作,這里使用的是face_camera 一、引入face_camera 在工程的pubspec.yaml中引入插件 # 檢測人臉face_camera: ^0.0.8iOS端需要設置相關權限 在info.plist文件中&…

如何按住ctrl滑動鼠標桌面圖標大小不變

如何按住ctrl滑動鼠標桌面圖標大小不變 采取以下步驟: 1、鼠標在電腦桌面空白處單擊右鍵,然后在彈出的對話框最上面有個“查看”,點擊“查看”出來的最上面有“大圖標”“中等圖標”“小圖標”,根據自己的需要選擇圖標大小即可。…