硬體編寫器 (HWC) HAL 會判斷最有效率的方式,將緩衝區與可用的硬體進行合成。HAL 採用的是裝置專屬的實作方式,通常由螢幕硬體原始設備製造商 (OEM) 執行。
只要考量疊加平面 (在顯示硬體而非 GPU 中合成的多個緩衝區),就能輕鬆瞭解這種做法的價值。舉例來說,以一般 Android 手機的直向模式為例,頂端有狀態列,底部有導覽列,其他地方則是應用程式內容。每個圖層的內容都位於不同的緩衝區中。您可以使用下列任一方法處理組合:
- 將應用程式內容算繪到暫存緩衝區中,然後對其顯示狀態列、其上方的導覽列,最後將暫存緩衝區傳遞至螢幕硬體。
- 將所有三個緩衝區傳遞至顯示硬體,並指示硬體從不同緩衝區讀取螢幕不同部分的資料。
後者方法的效率可能會大幅提升。
顯示處理器的功能差異很大。疊加層數、圖層是否可旋轉或混合,以及位置和重疊的限制,都很難透過 API 表達。為配合這些選項,HWC 會執行下列計算:
- SurfaceFlinger 提供 HWC 完整的圖層清單,並詢問:「您想要如何處理?」
- HWC 會回應,將每個圖層標示為裝置或用戶端組合。
- SurfaceFlinger 會處理任何用戶端,將輸出緩衝區傳遞至 HWC,並讓 HWC 處理其餘部分。
硬體供應商可以自訂決策程式碼,因此可以充分發揮每部裝置的效能。
當畫面上沒有任何變化時,疊加平面可能比 GL 合成效率低。當疊加內容含有透明像素,且重疊的圖層經過混合時,這種情況尤其明顯。在這種情況下,HWC 可以針對部分或所有圖層要求 GLES 合成作業,並保留已合成的緩衝區。如果 SurfaceFlinger 要求合成相同的緩衝區組合,HWC 可以顯示先前合成的暫存緩衝區。這麼做可以延長閒置裝置的電池續航力。
Android 裝置通常支援四個疊加層。如果嘗試合成的圖層數量超過疊加層,系統會針對其中部分圖層使用 GLES 合成,也就是說,應用程式使用的圖層數量會對耗電量和效能造成可測量的影響。