Hardware Composer (HWC) HAL 確定使用可用硬件合成緩衝區的最有效方式。作為 HAL,它的實現是特定於設備的,通常由顯示硬件 OEM 完成。
當您考慮覆蓋平面時,這種方法的價值很容易識別,它在顯示硬件而不是 GPU 中合成多個緩衝區。例如,考慮一個典型的縱向 Android 手機,狀態欄在頂部,導航欄在底部,應用程序內容在其他地方。每層的內容都在單獨的緩衝區中。您可以使用以下任一方法處理合成:
- 將應用程序內容渲染到暫存緩衝區,然後在其上渲染狀態欄、導航欄,最後將暫存緩衝區傳遞給顯示硬件。
- 將所有三個緩衝區傳遞給顯示硬件,並指示它從屏幕不同部分的不同緩衝區讀取數據。
後一種方法可以顯著提高效率。
顯示處理器功能差異很大。疊加層的數量、層是否可以旋轉或混合,以及對定位和重疊的限制都很難通過 API 來表達。為了適應這些選項,HWC 執行以下計算:
- SurfaceFlinger 為 HWC 提供了完整的層列表,並詢問:“你想如何處理這個?”
- HWC 通過將每一層標記為設備或客戶端組合來響應。
- SurfaceFlinger 負責處理任何客戶端,將輸出緩衝區傳遞給 HWC,並讓 HWC 處理其餘部分。
由於硬件供應商可以定制決策代碼,因此可以從每台設備中獲得最佳性能。
當屏幕上沒有任何變化時,疊加平面的效率可能低於 GL 合成。當覆蓋內容具有透明像素並且混合了重疊圖層時尤其如此。在這種情況下,HWC 可以為部分或所有層請求 GLES 合成並保留合成的緩衝區。如果 SurfaceFlinger 要求合成同一組緩衝區,HWC 可以顯示之前合成的暫存緩衝區。這可以提高空閒設備的電池壽命。
Android 設備通常支持四個覆蓋平面。嘗試合成比疊加層更多的層會導致系統對其中的一些使用 GLES 合成,這意味著應用程序使用的層數會對功耗和性能產生可衡量的影響。