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 度的提示時,請產生並套用矩陣至緩衝區,以免畫面跑到網頁結尾。為節省電力,請執行這項預先旋轉作業。詳情請參閱「ANativeWindow
」
system/core/include/system/window.h
中定義的介面。