Google致力於提高黑人社區的種族平等。 怎麼看。
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

SurfaceFlinger和WindowManager

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

SurfaceFlinger

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

SurfaceFlinger接受緩衝區的一種方式是通過BufferQueue和SurfaceControl。當應用程序出現在前台時,它向WindowManager請求緩衝區。然後,WindowManager從SurfaceFlinger請求一個圖層。圖層是Surface (包含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接口。