硬件合成器 (HWC) HAL 决定使用可用硬件合成缓冲区的最有效方式。作为 HAL,它的实现是设备特定的,通常由显示硬件 OEM 完成。
当您考虑叠加平面时,这种方法的价值很容易被认识到,叠加平面在显示硬件而不是 GPU 中合成多个缓冲区。例如,考虑一部典型的纵向 Android 手机,顶部有状态栏,底部有导航栏,其他地方都是应用内容。每个图层的内容都在单独的缓冲区中。您可以使用以下任一方法处理合成
- 将应用内容渲染到暂存缓冲区中,然后在上面渲染状态栏,在状态栏之上渲染导航栏,最后将暂存缓冲区传递给显示硬件。
- 将所有三个缓冲区传递给显示硬件,并指示它从不同缓冲区的不同屏幕部分读取数据。
后一种方法可能效率更高。
显示处理器功能差异很大。叠加的数量、图层是否可以旋转或混合,以及对定位和重叠的限制可能难以通过 API 表示。为了适应这些选项,HWC 执行以下计算
- SurfaceFlinger 向 HWC 提供完整的图层列表,并询问:“您想如何处理?”
- HWC 通过将每个图层标记为设备或客户端合成来响应。
- SurfaceFlinger 负责任何客户端,将输出缓冲区传递给 HWC,并让 HWC 处理其余部分。
因为硬件供应商可以自定义决策代码,所以可以从每台设备中获得最佳性能。
当屏幕上没有任何变化时,叠加平面可能不如 GL 合成有效。当叠加内容具有透明像素且重叠图层混合时,尤其如此。在这种情况下,HWC 可以请求对某些或所有图层进行 GLES 合成,并保留合成的缓冲区。如果 SurfaceFlinger 要求合成同一组缓冲区,则 HWC 可以显示先前合成的暂存缓冲区。这可以延长空闲设备的电池续航时间。
Android 设备通常支持四个叠加平面。尝试合成比叠加层更多的图层会导致系统对其中一些图层使用 GLES 合成,这意味着应用使用的图层数量会对功耗和性能产生可衡量的影响。