共计 1795 个字符,预计需要花费 5 分钟才能阅读完成。
Android 显示系统架构概述
Android 显示系统是一个复杂的多层架构,主要负责管理应用程序的图形数据并将其最终呈现到物理显示器上。整个流程可以概括为以下几个关键组件:

- 应用层 :生成图形数据(通过 Canvas、OpenGL ES 等)
- SurfaceFlinger:系统服务,负责合成多个应用层的 Surface
- Hardware Composer (HWC):硬件抽象层,负责将合成后的数据传递给显示硬件
- 显示驱动 :底层驱动,最终控制显示器输出
HWC 合成后数据传输的常见问题
在实际开发中,HWC 合成后的数据传输过程中经常遇到以下问题:
- 显示延迟 :从应用生成画面到最终显示的时间过长
- 画面撕裂 :显示器上半部分和下半部分显示不同帧的内容
- 丢帧 :系统无法在限定时间内完成一帧的传输和显示
HWC 合成后的数据格式
HWC 合成后的数据通常以 FrameBuffer 的形式存在,主要包含以下信息:
- 像素数据(通常是 RGBA 或 YUV 格式)
- 缓冲区句柄(用于跨进程传递)
- 显示元数据(如时间戳、显示层信息等)
从 SurfaceFlinger 到显示驱动的传输路径
- SurfaceFlinger 提交帧 :
- 收集所有应用的图形缓冲区
- 通过 HWC 进行硬件合成
-
将合成结果提交到显示队列
-
HWC 处理阶段 :
- 验证和优化合成方案
- 准备硬件特定的命令缓冲区
-
通过 ioctl 调用将数据传递给内核驱动
-
DRM/KMS 框架处理 :
- 内核中的 DRM 子系统接收数据
- KMS(Kernel Mode Setting)配置显示模式
- 最终将帧缓冲区内容扫描输出到显示器
VSync 信号的作用和同步机制
VSync(垂直同步)信号是显示系统中关键的时序信号,它:
- 标志着显示器完成一帧的扫描输出
- 用于同步应用渲染、SurfaceFlinger 合成和显示刷新
- 防止画面撕裂(通过双缓冲或三缓冲机制)
Android 中的 VSync 同步流程:
- 显示器硬件生成 VSync 信号
- 信号通过中断传递给显示驱动
- 驱动通知 SurfaceFlinger
- SurfaceFlinger 调度下一帧的合成
DRM/KMS 框架的角色
DRM(Direct Rendering Manager)和 KMS(Kernel Mode Setting)是 Linux 内核中管理图形硬件的子系统,它们在 Android 显示系统中负责:
- 管理显示资源(如多个显示器)
- 处理显示模式设置
- 管理帧缓冲区
- 提供原子化的显示更新
关键代码分析
以下是 SurfaceFlinger 提交帧到 HWC 的关键代码片段(简化版):
// SurfaceFlinger.cpp
void SurfaceFlinger::postComposition() {
// 获取 HWC 服务
sp<HWComposer> hwc = mHwc;
// 准备要提交的帧
HWComposer::LayerListIterator cur = hwc->begin();
// 设置各层的参数
for (size_t i=0; i<count; i++) {
hwc_layer_1_t& layer = *cur;
layer.handle = buffer->handle;
layer.transform = transform;
// 其他参数设置...
++cur;
}
// 提交到 HWC
hwc->prepare();
hwc->set();}
性能考量与优化方法
要优化 HWC 合成后的数据传输性能,可以考虑以下方法:
- 减少缓冲区拷贝 :
- 使用 DMA-BUF 共享内存
-
实现零拷贝传输路径
-
优化合成策略 :
- 尽可能使用硬件叠加层(overlay)
-
减少需要合成的层数
-
VSync 调优 :
- 动态调整 VSync 偏移
-
实现自适应刷新率
-
内存带宽优化 :
- 使用压缩的帧缓冲区格式
- 优化访问模式
常见问题排查方法
当遇到显示问题时,可以按照以下步骤排查:
- 检查 VSync 信号是否正常生成
- 验证 HWC 是否成功完成合成
- 检查 DRM/KMS 的日志信息
- 测量各阶段的耗时,找出瓶颈
- 使用 dumpsys surfaceflinger 命令获取系统状态
思考题:高刷新率场景优化
随着高刷新率显示器(120Hz、144Hz 甚至更高)的普及,数据传输面临新的挑战:
- 如何保证在更短的帧间隔内完成数据传输?
- 如何平衡功耗和性能?
- 多应用不同刷新率需求如何协调?
可能的优化方向包括:
- 实现部分帧更新(只传输变化区域)
- 动态调整合成策略
- 改进内存子系统带宽利用率
- 应用预测性渲染技术
通过深入理解 Android 显示系统的工作机制,开发者可以更好地优化应用性能,解决显示相关问题,并为新兴的高刷新率场景做好准备。
正文完
