Android 的 GUI 渲染系统是一个高度复杂的异步系统,其核心任务是将应用绘制的原始数据(Buffer)最终显示在物理屏幕上。该系统的基石是 SurfaceFlinger、Hardware Composer (HWC) 和 BufferQueue。
1. 生产者-消费者模型:BufferQueue
BufferQueue 是 Android 图形架构的心脏,它连接了图形数据的生产者(应用进程)和消费者(SurfaceFlinger)。
| 核心组件 | 职责描述 | 对应角色 |
|---|---|---|
| Producer (生产者) | 通常是应用进程,通过 Canvas、OpenGL ES 或 Vulkan 渲染数据并“入队”。 | Surface / GraphicBufferProducer |
| Consumer (消费者) | 通常是 SurfaceFlinger,负责从队列中“出队”缓冲区进行合成。 |
SurfaceFlinger / GraphicBufferConsumer |
| BufferQueue | 管理缓冲区的流转逻辑,处理同步和排队。 | 中间协调层 |
流程简述:
- Dequeue: 生产者申请一块可用的缓冲区。
- Queue: 生产者绘制完成后,将缓冲区还给队列。
- Acquire: 消费者从队列中获取该缓冲区。
- Release: 消费者合成完毕后,释放缓冲区供生产者重用。
2. 图形合成之王:SurfaceFlinger
SurfaceFlinger 是系统级服务,负责接收多个来源的图形 Buffer,并按照 Z-Order 合成到同一个帧缓冲区(FrameBuffer)中。
| 核心任务 | 技术细节 |
|---|---|
| Layer 管理 | 每个窗口在 SurfaceFlinger 中对应一个 Layer(层)。 |
| VSync 响应 | 监听硬件 VSync 信号,驱动整个合成流程(处理 Input、动画、绘制、合成)。 |
| 合成策略 | 决定使用 GPU (Client Composition) 还是 HWC (Device Composition) 进行合成。 |
3. 硬件合成加速:Hardware Composer (HWC)
HWC 是 Android 硬件抽象层(HAL)的一部分,旨在减轻 GPU 的负担。
- **GPU 合成 (Client)**:所有 Layer 由 GPU 绘制到一个 Buffer,SF 将该 Buffer 送显。耗电且占用显存。
- HWC 合成 (Device):SF 告知 HWC 所有的 Layer 及其坐标,由屏幕控制器直接将多块内存叠加显示。极度节省功耗。
HWC 决策逻辑:
SurfaceFlinger 会询问 HWC:这些 Layer 你能处理吗?HWC 会根据硬件能力(层数限制、缩放限制等)返回哪些层它自己合,哪些需要 SF 用 GPU 准备好。
4. 屏幕刷新与 VSync 信号
VSync(垂直同步信号)是保证图形不掉帧、不撕裂的核心机制。
- Choreographer:应用端的“节拍器”。它收到 VSync 后触发 View 的
doFrame(Measure/Layout/Draw)。 - **Triple Buffering (三缓冲)**:为了解决双缓冲在 GPU/CPU 耗时较长时导致的掉帧问题,Android 引入三缓冲,增加了一块缓冲空间作为“临时仓库”。
- 帧调度:
- VSync-app:提醒应用开始产出 Buffer。
- VSync-sf:提醒 SurfaceFlinger 开始合成 Buffer。
5. 总结
| 关键术语 | 一句话定义 |
|---|---|
| Surface | 应用端的绘图表面,持有 BufferQueue 的生产者端。 |
| GraphicBuffer | 真实的内存空间,存储像素数据。 |
| HWC | 硬件合成器,能用低功耗方式“拼图”的专用芯片。 |
| VSync | 整个 GUI 系统的跳动心脏,同步产出与消费的节奏。 |