高通平台Display显示架构


一、显示整体架构

在这里插入图片描述


二、SurfaceFlinger

SurfaceFlinger是一个系统服务,如:audioflinger等等,这个系统服务主要实现了Surface的建立、控制、管理等功能。换种说法就是,在Android 的实现中它是一个service,提供系统范围内的surface composer功能,它能够将各种应用程序的2D、3D surface进行组合。

SurfaceFlinger是整个Android系统渲染的核心进程。所有应用的渲染逻辑最终都会来到SF中进行处理,最终会把处理后的图像数据交给CPU或者GPU进行绘制,在每一个应用中都以Surface作为一个图元传递单元,向SF这个服务端传递图元数据。
目前SurfaceFlinger中支持两种合成方式,一种是Device合成,一种是Client合成。SurfaceFlinger 在收集可见层的所有缓冲区之后,便会询问Hardware Composer应如何进行合成。

  • 1、Device合成
    Device合成方式是相对与硬件合成来说的,其合成方式是,将各个Layer的内容用GPU渲染到暂存缓冲区中,最后将暂存缓冲区传送到显示硬件。这个暂存缓冲区,我们称为FBTarget,每个Display设备有各自的FBTarget。Device合成,之前称为GLES合成,我们也可以称之为GPU合成。Device合成,采用RenderEngine进行合成。
  • 2、Client合成
    Client合成就是用专门的硬件合成器进行合成HWComposer,所以硬件合成的能力就取决于硬件的实现。其合成方式是将各个Layer的数据全部传给显示硬件,并告知它从不同的缓冲区读取屏幕不同部分的数据。

三、HWC

HWC是Android中进行窗口合成和显示的HAL层模块,通常是由OEM实现并完成,为SurfaceFlinger提供硬件支持。

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

HWC合成机制:

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

四、Gralloc

在android中,HAL层的gralloc库负责申请图形缓冲区的所有工作,HAL层之上的Surface、BufferQueue最终都是调用gralloc库去申请图形缓冲区,然后返回给上层一个buffer_handle_t

gralloc分配framebuff图形缓冲区
gralloc调用gralloc_alloc_framebuffer()分配framebuffer的内存,其核心是对fb设备/dev/graphics/fb或者/dev/fb执行mmap(),映射到用户空间

gralloc分配普通图形缓冲区
普通图形缓冲去则是通过gralloc_alloc_buffer()分配内存的


五、DisplayManagerService

DisplayManagerServices主要是用来管理显示的生命周期,它决定如何根据当前连接的物理显示设备控制其逻辑显示,并且在状态更改时,向系统和应用程序发送通知。

默认支持4种显示类型:

  1. LocalDisaplay:本地物理屏幕显示设备,DMS启动之后通过SurfaceFlinger获取物理屏数据
  2. OverlayDisplay: 模拟辅助显示设备, 开发者选项->模拟辅助显示
  3. WIFIDisplay: 无线连接显示设备, Wifi连接显示的物理屏幕
  4. VirtualDisplay: 虚拟显示设备,如VR ,屏幕录制

提供上层访问的主要接口:

  • public Display[ ] getDisplays():获取当前所有有效的logic display列表
  • public Display getDisplay(int displayId):根据displayId获取logic display的信息
  • public void registerDisplayListener(DisplayListener listener, Handler handler):
    注册显示器监听事件,用来监听显示器的新增,删除,变更等事件
  • public void unregisterDisplayListener(DisplayListener listener):
    取消显示器监听事件

六、WindowManagerService

WindowManagerService是WindowManager的管理者,负责窗口的启动、添加和删除,WindowManager会监控窗口的生命周期、输入事件、屏幕方向、旋转、动画、位置等多种状态,同时会将所有窗口的元数据发送给SurfaceFlinger,SurfaceFlinger使用这些数据在屏幕上合成Surface。

在这里插入图片描述


相关推荐

  1. sensor初始化步骤

    2024-07-10 18:48:06       22 阅读
  2. Android11 添加新分区的方法

    2024-07-10 18:48:06       22 阅读
  3. android的Framework开发遇到的一些问题总结

    2024-07-10 18:48:06       17 阅读
  4. 日志分析架构方案

    2024-07-10 18:48:06       49 阅读
  5. CSS Display(显示)

    2024-07-10 18:48:06       19 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 18:48:06       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 18:48:06       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 18:48:06       45 阅读
  4. Python语言-面向对象

    2024-07-10 18:48:06       55 阅读

热门阅读

  1. C#规则引擎

    2024-07-10 18:48:06       18 阅读
  2. 深度学习Day-24:ResNeXt-50算法思考

    2024-07-10 18:48:06       22 阅读
  3. 完全背包求具体方案(c++题解)

    2024-07-10 18:48:06       21 阅读
  4. Pull Request

    2024-07-10 18:48:06       18 阅读
  5. stm32使用硬件SPI

    2024-07-10 18:48:06       16 阅读
  6. Elasticsearch7.10集群搭建

    2024-07-10 18:48:06       16 阅读
  7. 串口工具推荐

    2024-07-10 18:48:06       19 阅读
  8. Python实现Mybatis Plus

    2024-07-10 18:48:06       23 阅读
  9. 管理客户的10个CRM系统技巧

    2024-07-10 18:48:06       24 阅读
  10. 四、Python日志系统之日志文件的备份和删除

    2024-07-10 18:48:06       18 阅读