硬件作曲家 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 合成,這意味著應用程序使用的層數會對功耗和性能產生可衡量的影響。