Android SurfaceFlinger是Android系统中负责窗口管理和图像合成的核心组件。它接收来自不同应用的图层数据,并将这些图层合并成一个单一的图像,然后输出到显示设备上。SurfaceFlinger的合成方式主要涉及两种:Client合成和Device合成。
adb shell dumpsys surfaceflinger中过滤HWC layers可以看到图层合成方式以及分辨率信息
一、Client合成
-
定义:Client合成是应用程序通过Surface API提供的功能,将图形元素绘制在自己的Surface上。然后,SurfaceFlinger将这些Surface合成为一个整体,并显示在屏幕上。
-
特点:
- 使用软件图形库(如OpenGL ES、Skia等)进行合成,这些图形库通常会操作GPU来完成合成工作。
- 消耗资源较多,但功能强大,支持各种复杂效果。
- 在合成过程中,SurfaceFlinger会创建GraphicBuffer来存储待合成的图层数据。
-
涉及对象:
- RenderEngine:负责Client合成的渲染引擎。
- BufferQueue:提供buffer,用于保存合成后的结果或应用绘制阶段的图层数据。
二、Device合成
-
定义:Device合成是一种特殊的合成方式,它利用硬件加速功能对图形元素进行合成,因此在性能方面更有优势。在这种方式下,应用程序不直接绘制图形元素,而是通过向SurfaceFlinger提供缓冲区的方式,由SurfaceFlinger进行合成。
-
特点:
- 使用特定的硬件合成图层,如高通平台的MDP。
- 合成效率更高,但能力有限,不支持复杂图形的合成。
-
涉及对象:
- HWComposer:HWComposer HAL的客户端包装类,负责Device合成。
- GraphicBuffer:作为缓冲区,存储待合成的图层数据。
HWC合成
HWC是Android系统中的硬件混合渲染器,它通过硬件抽象层(HAL)与显示硬件进行通信。HWC合成是一种高效的合成方式,因为它可以直接在显示硬件中合成多个缓冲区,而不需要完全依赖GPU。
HWC合成的主要步骤包括:
- 图层准备:SurfaceFlinger接收来自不同应用的图层数据,并将这些图层按照一定的顺序进行排序。
- 图层合成:HWC根据图层的顺序和属性,在显示硬件中合成这些图层。HWC会考虑图层的透明度、混合模式等因素,以确保合成结果的正确性。
- 显示输出:合成后的图像被直接输出到显示设备上,供用户查看。
GPU合成
当HWC无法处理某些图层的合成时,SurfaceFlinger会回退到GPU合成。GPU合成是一种更灵活但可能相对较慢的合成方式,因为它需要依赖GPU进行图形处理。
GPU合成的主要步骤包括:
- 图层准备:与HWC合成相同,SurfaceFlinger接收来自不同应用的图层数据,并进行排序。
- GPU渲染:SurfaceFlinger将图层数据传递给GPU,由GPU进行渲染和合成。GPU会根据图层的属性(如颜色、纹理、透明度等)进行渲染,并生成最终的合成图像。
- HWC提交:合成后的图像被传递给HWC,由HWC将其输出到显示设备上。这一步是为了确保图像能够正确地显示在屏幕上,同时利用HWC的硬件加速能力来提高显示效率。
混合使用HWC和GPU合成
HWC和GPU的合成关系:
在实际应用中,SurfaceFlinger通常会根据设备的硬件特性和性能要求,混合使用HWC和GPU合成。例如,对于简单的图层合成任务,SurfaceFlinger可能会选择使用HWC合成来提高效率;而对于复杂的图层合成任务,它可能会选择使用GPU合成来确保合成结果的正确性和质量。
此外,SurfaceFlinger还会根据屏幕内容的变化情况,动态调整合成策略。例如,当屏幕上的内容没有变化时,SurfaceFlinger可能会选择保留之前的合成结果,以减少不必要的渲染和合成操作,从而节省电量和提高性能。
综上所述,Android SurfaceFlinger的合成方式主要包括HWC合成和GPU合成两种。在实际应用中,SurfaceFlinger会根据设备的硬件特性和性能要求,以及屏幕内容的变化情况,灵活地选择和使用这两种合成方式,以确保图像能够正确地显示在屏幕上,并尽可能地提高显示效率和性能。