SurfaceFlinger 和 WindowManager

SurfaceFlinger 接受緩衝區,組成緩衝區,並將緩衝區發送到顯示器。 WindowManager 為 SurfaceFlinger 提供緩衝區和窗口元數據,SurfaceFlinger 使用它們將表面合成到顯示器。

SurfaceFlinger

SurfaceFlinger 可以通過兩種方式接受緩衝區:通過 BufferQueue 和 SurfaceControl,或者通過 ASurfaceControl。

SurfaceFlinger 接受緩衝區的一種方式是通過 BufferQueue 和 SurfaceControl。當一個應用程序來到前台,它要求從緩衝區窗口管理器。 WindowManager 然後從 SurfaceFlinger 請求一個層。阿層是一個的組合表面,其中包含BufferQueue和SurfaceControl ,其中包含像顯示幀中的層的元數據。 SurfaceFlinger 創建層並將其發送到 WindowManager。 WindowManager 然後將表面發送到應用程序,但保留 SurfaceControl 來操縱應用程序在屏幕上的外觀。

Android 10 增加了 ASurfaceControl,這是 SurfaceFlinger 可以接受緩衝區的另一種方式。 ASurfaceControl 將一個表面和一個 SurfaceControl 組合成一個發送給 SurfaceFlinger 的事務包。 ASurfaceControl 與圖層相關聯,應用程序通過 ASurfaceTransactions 更新圖層。然後,應用程序通過傳遞包含信息的 ASurfaceTransactionStats 的回調獲取有關 ASurfaceTransactions 的信息,例如閂鎖時間、獲取時間等。

下表包含有關 ASurfaceControl 及其關聯組件的更多詳細信息。

成分描述
表面控制包裝 SurfaceControl 並使應用程序能夠創建與顯示器上的圖層相對應的 SurfaceControl。

可以創建為 ANativeWindow 的子項或另一個 ASurfaceControl 的子項。
表面交易包裝事務以使客戶端能夠編輯圖層的描述性屬性,例如幾何圖形,並將更新的緩衝區發送到 SurfaceFlinger。
ASurfaceTransactionStats通過預註冊的回調將有關已呈現的事務的信息(例如閂鎖時間、獲取時間和先前發布柵欄)發送到應用程序。

儘管應用程序可以隨時提交緩衝區,但 SurfaceFlinger 只會在顯示刷新之間喚醒以接受緩衝區,這可能因設備而異。這最大限度地減少了內存使用並避免了屏幕上的可見撕裂,這在更新顯示中間刷新時可能發生。

當顯示器是刷新之間時,顯示發送VSYNC信號SurfaceFlinger的。 VSYNC 信號表示可以在不撕裂的情況下刷新顯示。當 SurfaceFlinger 接收到 VSYNC 信號時,SurfaceFlinger 會遍歷它的層列表以尋找新的緩衝區。如果 SurfaceFlinger 找到新的緩衝區,則 SurfaceFlinger 獲取緩衝區;如果沒有,SurfaceFlinger 繼續使用之前獲取的緩衝區。 SurfaceFlinger 必須始終顯示某些內容,因此它會掛在一個緩衝區上。如果層上沒有提交任何緩衝區,則忽略該層。

在 SurfaceFlinger 收集可見層的所有緩衝區後,它會詢問硬件合成器 (HWC) 應如何執行合成。如果 HWC 將層合成類型標記為客戶端合成,SurfaceFlinger 會合成這些層。然後,通過SurfaceFlinger的輸出緩衝器到HWC

窗口管理器

窗口管理控制窗口的對象,這是用於容器視圖對象。窗口對象總是由表面對象支持。 WindowManager 監督生命週期、輸入和焦點事件、屏幕方向、過渡、動畫、位置、變換、z 順序和窗口的許多其他方面。 WindowManager 將所有窗口元數據發送到 SurfaceFlinger,以便 SurfaceFlinger 可以使用該數據在顯示器上合成表面。

預旋轉

許多硬件覆蓋不支持旋轉(即使支持,也會消耗處理能力);解決方案是在緩衝區到達 SurfaceFlinger 之前對其進行轉換。 Android支持查詢提示( NATIVE_WINDOW_TRANSFORM_HINT )在ANativeWindow來表示最可能的變換將被施加到由SurfaceFlinger的緩衝區。 GL 驅動程序可以使用此提示在緩衝區到達 SurfaceFlinger 之前對其進行預轉換,以便在緩衝區到達時正確轉換。

例如,當收到旋轉 90 度的提示時,生成一個矩陣並將其應用到緩衝區以防止它跑出頁面的末尾。為節省電力,請執行此預旋轉。有關詳細信息,請參閱ANativeWindow中定義的接口system/core/include/system/window.h