Android GUI系统之SurfaceFlinger(11)理解HWComposer

该系列文章总纲链接:Android GUI系统之SurfaceFlinger 系列文章目录


本章关键点总结 & 说明:

Android GUI系统之SurfaceFlinger(11)理解HWComposer_第1张图片

本章节思维导图如上。主要从7个方面讲述了HWC的概念,这里 主要关注 HWC的流程、功能、效率。


1 HWC概述

HWC(hwcomposer)是Android中进行窗口(Layer)合成和显示的HAL层模块(注意:不是SurfaceFlinger代码中HWcomposer这个类),通常由显示设备制造商 (OEM)实现并完成,为SurfaceFlinger服务提供硬件支持。

2 为什么使用HWC

SurfaceFlinger可以使用OpenGL ES合成Layer,这需要占用并消耗GPU资源。大多数GPU都没有针对图层合成进行优化,因此当SurfaceFlinger通过GPU合成图层时,应用程序无法使用GPU进行自己的渲染。而HWC通过硬件设备进行图层合成,可以减轻GPU的合成压力。

Hwcomposer HAL是从Honeycomb(3.0)引入,取代2.3的Overlay实现方式(但不是必须的),以降低代码实现及维护难度。它的实现版本经历了1.0到1.3的演变,在Jellybean MR1(4.2)实现的1.1版本,引入了硬件组合抽象层(HWComposer)的概念,向上对SurfaceFlinger完全隐藏了平台显示硬件特性,这样设计的好处是可以充分发挥硬件性能,同时降低SurfaceFlinger和硬件平台的耦合度(方便移植)。

3 Overlay技术简介

因为HWComposer机制最开的目的是为了替代Overlay的,所以我们这里简单介绍下 Overlay技术:Overlay(覆盖)是一种数字视频的显示技术,它允许数字信号不经过显示芯片处理,而直接通过显存输出到显示器屏幕上。Overlay显示模式最大的用途在于优化视频播放。由于不同的视频有不同基准色调、亮度、对比度和饱和度,对于不同的电脑、不同的视频文件,为了获得最好的显示效果就需要对各种显示属性进行调节,普通显示模式显然无法胜任,所以就用到了Overlay显示模式进行单独调节。Overlay显示模式具有速度快、画质好、占用系统资源少等特点,很适合于视频播放。

4 HWC流程

显示设备的能力千差万别,很难直接用API表示硬件设备支持合成的Layer数量,Layer是否可以进行旋转和混合模式操作,以及对图层定位和硬件合成的限制等。因此HWC描述上述信息的流程是这样的:

  1. SurfaceFlingerHWC提供所有Layer的完整列表,让HWC根据其硬件能力,决定如何处理这些Layer
  2. HWC会为每个Layer标注合成方式,表明是通过GPU还是通过HWC合成。
  3. SurfaceFlinger负责先把所有注明GPU合成的Layer合成到一个输出Buffer,然后把这个输出Buffer和其他Layer(注明HWC合成的Layer)一起交给HWC,让HWC完成剩余Layer的合成和显示。

5 HWC具备功能

虽然每个显示设备的能力不同,但是官方要求每个HWC硬件模块都应该支持以下能力:

  1. 至少支持4个叠加层:状态栏、系统栏、应用本身和壁纸或者背景。
  2. 叠加层可以大于显示屏,例如:壁纸
  3. 同时支持预乘每像素(per-pixel)Alpha混合和每平面(per-plane)Alpha混合。
  4. 为了支持受保护的内容,必须提供受保护视频播放的硬件路径。
  5. RGBA packing order, YUV formats, and tiling, swizzling, and stride properties

部分专业词汇说明:

  1. Tiling:可以把Image切割成MxN个小块,最后渲染时,再将这些小块拼接起来,就像铺瓷砖一样。
  2. Swizzling:一种拌和技术,表示向量单元可以被任意地重排或重复。

6 HWC效率

并非所有情况下HWC都比GPU更高效,例如:当屏幕上没有任何变化时,尤其是叠加层有透明像素并且需要进行图层透明像素混合时。在这种情况下,HWC可以要求部分或者全部叠加层都进行GPU合成,然后HWC持有合成的结果Buffer,如果SurfaceFlinger 要求合成相同的叠加图层列表,HWC可以直接显示之前合成的结果Buffer,这有助于提高待机设备的电池寿命。

7 Android系统合成Surface的方式选择

目前SurfaceFlinger中支持两种合成方式,一种是Device合成,一种是Client合成。SurfaceFlinger 在收集可见层的所有缓冲区之后,便会询问 Hardware Composer 应如何进行合成。

7.1 Client合成
Client合成方式是相对与硬件合成来说的,其合成方式是,将各个Layer的内容用GPU渲染到暂存缓冲区中,最后将暂存缓冲区传送到显示硬件。这个暂存缓冲区,我们称为FBTarget,每个Display设备有各自的FBTarget。Client合成,之前称为GLES合成,我们也可以称之为GPU合成。Client合成,采用RenderEngine进行合成。

7.2 Device合成
就是用专门的硬件合成器进行合成HWComposer,所以硬件合成的能力就取决于硬件的实现。其合成方式是将各个Layer的数据全部传给显示硬件,并告知它从不同的缓冲区读取屏幕不同部分的数据。HWComposer是Devicehec的抽象。

 

你可能感兴趣的:(显示子系统,android)