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