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 更新接著,應用程式會透過回呼取得 ASurfaceTransactions 相關資訊,這些回呼會傳遞包含資訊的 ASurfaceTransactionStats,例如鎖定時間、取得時間等。

下表列出 ASurfaceControl 及其 相關的元件

元件 說明
ASurfaceControl 包裝 SurfaceControl,讓應用程式能夠建立與螢幕上層級相對應的 SurfaceControl。

可做為 ANativeWindow 的子項或其他 ASurfaceControl 的子項建立。
ASurfaceTransaction 包裝交易,讓用戶端可以編輯圖層的描述性屬性 (例如幾何圖形),並將更新的緩衝區傳送至 SurfaceFlinger。
顯示交易統計資料 傳送顯示的交易資訊,例如 透過快速部署應用程式 預先註冊回呼。

雖然應用程式隨時可以提交緩衝區,但 SurfaceFlinger 只會在 接受螢幕重新整理之間的緩衝區,但可能會因 裝置。這可以盡量減少記憶體用量,避免在 螢幕,在更新螢幕進行中重新整理時可能會發生。

當螢幕處於重新整理之間時,螢幕會將 VSYNC 信號傳送至 SurfaceFlinger。VSYNC 信號代表螢幕可以 再也不必抓到當 SurfaceFlinger 收到 VSYNC 信號時,SurfaceFlinger 會逐一檢查圖層清單,尋找新的緩衝區。如果 SurfaceFlinger 找到新的緩衝區,就會取得該緩衝區;如果沒有,則會繼續使用先前取得的緩衝區。SurfaceFlinger 必須一律顯示內容,因此會掛在一個緩衝區。如果 此圖層就會遭到忽略

SurfaceFlinger 收集可見層的所有緩衝區後,會詢問 執行 Hardware Composer (HWC) 的組合執行方式。如果 HWC 將圖層組合類型標示為用戶端組合,SurfaceFlinger 就會將這些圖層組合。接著,SurfaceFlinger 會將輸出緩衝區傳遞至 HWC

WindowManager

WindowManager 會控制 window 物件,這些物件是「View」物件的容器。視窗物件一律由表面物件支援。WindowManager 會監督視窗的生命週期、輸入和焦點事件、螢幕方向、轉場、動畫、位置、轉換、z 順序和其他多項相關事項。WindowManager 會將所有視窗中繼資料傳送至 SurfaceFlinger,讓 SurfaceFlinger 可使用該資料在螢幕上合成介面。

預旋轉

許多硬體覆疊層都不支援旋轉 (即使支援,也會耗用處理效能);解決方法是在緩衝區到達 SurfaceFlinger 之前轉換緩衝區。Android 支援查詢提示 在ANativeWindow (NATIVE_WINDOW_TRANSFORM_HINT) 到 代表最有可能套用至緩衝區的轉換 SurfaceFlinger。GL 驅動程式可利用這項提示,在緩衝區抵達 SurfaceFlinger 之前預先轉換,這樣緩衝區抵達時,就能正確轉換。

舉例來說,當您收到旋轉 90 度的提示時,請產生並套用矩陣至緩衝區,以免畫面跑到網頁結尾。為節省電力,請執行這項預先旋轉作業。詳情請參閱「ANativeWindowsystem/core/include/system/window.h 中定義的介面。