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