硬體 Composer HAL

硬體編寫器 (HWC) HAL 會判斷最有效率的方式,將緩衝區與可用的硬體進行合成。由於 HAL 是裝置專屬,因此通常由顯示器硬體 OEM 執行。

只要考量疊加平面 (在顯示硬體而非 GPU 中合成的多個緩衝區),就能輕鬆瞭解這種做法的價值。舉例來說,以一般 Android 手機的直向模式為例,頂端有狀態列、底部有導覽列,其他地方則是應用程式內容。每個圖層的內容都位於不同的緩衝區中。您可以使用下列任一方法處理組合:

  • 將應用程式內容轉譯至暫存緩衝區,然後在其上方轉譯狀態列,再在其上方轉譯導覽列,最後將暫存緩衝區傳遞至顯示硬體。
  • 將所有三個緩衝區傳遞至顯示硬體,並指示硬體從不同緩衝區讀取螢幕不同部分的資料。

後者方法的效率可能會大幅提升。

顯示處理器的功能差異很大。疊加層數、圖層是否可旋轉或混合,以及位置和重疊的限制,都很難透過 API 表達。為了支援這些選項,HWC 會執行下列計算:

  1. SurfaceFlinger 會向 HWC 提供完整的圖層清單,並詢問「您要如何處理這個問題?」
  2. HWC 會回應,將每個圖層標示為裝置或用戶端組合。
  3. SurfaceFlinger 會處理任何用戶端,將輸出緩衝區傳遞至 HWC,並讓 HWC 處理其餘部分。

硬體供應商可以自訂決策程式碼,因此可以充分發揮每部裝置的效能。

當畫面上沒有任何變化時,疊加平面可能比 GL 合成效率低。當疊加內容含有透明像素,且重疊的圖層經過混合時,這種情況尤其明顯。在這種情況下,HWC 可以針對部分或所有圖層要求 GLES 合成,並保留已合成的緩衝區。如果 SurfaceFlinger 要求合成相同的緩衝區集合,HWC 可以顯示先前合成的暫存緩衝區。這麼做可以延長閒置裝置的電池續航力。

Android 裝置通常支援四個疊加層。如果嘗試合成的圖層數量超過疊加層,系統會針對其中部分圖層使用 GLES 合成,也就是說,應用程式使用的圖層數量會對耗電量和效能造成可測量的影響。