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 抓trace
https://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