SurfaceFlinger和WindowManager

SurfaceFlinger接受緩衝區,組成緩衝區,然後將緩衝區發送到顯示器。 WindowManager為SurfaceFlinger提供緩衝區和窗口元數據,SurfaceFlinger用於將表面合成到顯示中。

SurfaceFlinger

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

SurfaceFlinger接受緩衝區的一種方式是通過BufferQueue和SurfaceControl。當應用程序出現在前台時,它向WindowManager請求緩衝區。然後,WindowManager從SurfaceFlinger請求一個圖層。圖層是一個表面(包含BufferQueue)和一個SurfaceControl (其包含圖層元數據,如顯示框架)的組合。 SurfaceFlinger創建圖層並將其發送到WindowManager。然後,WindowManager將表面發送到應用程序,但保留SurfaceControl來控制應用程序在屏幕上的外觀。

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

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

成分描述
ASurfaceControl包裝SurfaceControl,使應用程序可以創建與顯示器上的圖層相對應的SurfaceControl。

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

儘管應用程序可以隨時提交緩衝區,但SurfaceFlinger僅在顯示器刷新之間喚醒以接受緩衝區,具體取決於設備而有所不同。這樣可以最大程度地減少內存使用量,並避免在更新顯示屏中間刷新時可能出現的屏幕撕裂。

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

在SurfaceFlinger收集了所有可見層的緩衝區之後,它詢問硬件編寫器(HWC)應該如何執行合成。如果HWC將圖層合成類型標記為客戶端合成,則SurfaceFlinger會合成這些圖層。然後,SurfaceFlinger將輸出緩衝區傳遞給HWC

窗口管理器

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

預旋轉

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

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