Layer 和 Display 是图像显示合成,与显示器硬件交互的两个基本元素。
Layer (层)
层 是最重要的合成单元。一个 层 包含了 一个 Surface 和 一个 SurafceControl。每一个 层 有一些列的属性来定义与其他层的交互。层的属性如下表:
属性 | 描述 |
---|---|
位置相关的 | 定义了 层 在 Display 上的显示位置。包括四个边的位置, 和相对其他 层 的 z-order, 也就是 层 和 层 的层叠关系 |
内容相关的 | 定义了内容如何显示在上面位置定义的区域内。包括了裁切(内容拉伸到比上面定义的区域大了), 和变换(反转或者旋转) |
合成相关的 | 定义了层和层如何合成, 包括融合的模式,alpyha 的合成 |
优化相关的 | 提供了一些不是必要的信息,但是会指导 HWC 去更高效的合成。包括了层的可见区域,和已经更新了的区域 |
这个部分的信息像极了现在正在做的视频编辑 sdk 的视频帧的绘制部分。实际上本来就是一样的。
Display (就译成显示器吧, 形象,具象, 但是这是个抽象概念,不是那个显示器)
这里的 显示器 是图像合成里的另一个重要的单元。一个系统可以有多个显示器,显示器可以被添加或者移除。显示器会根据系统或者 HWC 的需求而添加和删除。
HWC 会在显示器设备添加或移除的时候请求 显示器 添加或者删除,这叫热插拔。
客户端会请求虚拟显示器,虚拟现实器的内容会被渲染到一个离屏的缓冲区而不是物理的设备上。这就是这个抽象概念的作用,它不仅可以代表一个显示器设备,还可以代表一个缓冲区。
Virtual Display (虚拟显示器)
SurfaceFlinger 支持一个内部屏幕(比如手机和平板的屏幕),外部屏幕(比如通过 HDMI 连接的电视),和一个或多个虚拟显示器。虚拟现实器使得合成的图像可以被系统使用。虚拟显示器可以备用来录制屏幕或者或者把屏幕内容发送到网络上去。为虚拟现实器生成的帧会写入 BufferQueue
虚拟显示器可能会和主显示器共享一堆层,也可能有它们自己的。虚拟现实器没有 VSYNC 信号,这样内部显示器的 VSYNC 信号就用来出发所有显示器的合成。
当 HWC 支持虚拟现实器时, 虚拟现实器可能被 GLES 实现,也可能被 HWC 实现,或者被它两者一块实现。当 HWC 不支持虚拟现实器时,系统会使用 GLES 实现。