3. 图形合成核心概念
在车载多屏显示系统中,图形合成并不是“把画面画出来”这么简单,而是围绕一组核心对象和时序机制,把来自不同应用、不同安全等级、不同刷新需求的画面,稳定地组织到多个屏幕上。理解图层、窗口、表面、缓冲区、合成器、显示管线与帧同步,是后续做多屏布局、性能优化和故障排查的基础。
一、从“画什么”到“怎么送到屏幕”:七个核心对象
可以把整个显示链路理解为一条从内容生产到像素输出的流水线。应用并不直接操作屏幕,而是先产生“表面”,再由“合成器”把多个“图层”按“窗口”区域组织起来,写入“缓冲区”,最后通过“显示管线”扫描输出,并由“帧同步”保证节奏一致。
- 图层(Layer):合成器可独立控制的最小视觉单元,拥有自己的位置、大小、透明度、Z序和可见性。车载中常见的有地图层、仪表层、报警层、视频层。
- 窗口(Window):面向应用或系统的逻辑显示区域,通常对应一个矩形范围,内部可以包含一个或多个图层。窗口决定“内容放在哪里”,图层决定“内容怎么叠”。
- 表面(Surface):应用实际绘制内容的像素载体,是图形库(如 OpenGL ES、Vulkan、Skia)的渲染目标。一个窗口可以绑定一个或多个表面。
- 缓冲区(Buffer):表面背后的内存块,通常采用多缓冲机制(双缓冲或三缓冲)。前台缓冲用于显示,后台缓冲用于绘制,避免撕裂。
- 合成器(Compositor):负责把多个图层按规则合并成最终帧。它决定谁在上、谁在下、是否混合、是否缩放、是否旋转。
- 显示管线(Display Pipeline):从合成帧到物理屏幕的扫描输出路径,包含色彩空间转换、Gamma、缩放、时序控制等。
- 帧同步(Frame Sync):用 VSync、Fence、Present 时间等机制,让绘制、合成、显示三个环节按同一节拍推进,避免撕裂、卡顿和延迟累积。
一句话理解:应用画到“表面”,表面由“缓冲区”承载,多个表面被组织成“窗口”和“图层”,由“合成器”合并,经“显示管线”输出,并由“帧同步”统一节奏。
二、合成器如何工作:从图层到最终帧
合成器的核心任务是“按规则合并”。它通常维护一棵图层树或图层列表,每个图层带有自己的属性:位置、尺寸、Z序、透明度、裁剪区域、变换矩阵、混合模式。合成时,合成器从最底层开始,依次把每个图层的像素写入目标缓冲区,遇到透明区域则进行 Alpha 混合,遇到缩放或旋转则调用 GPU 采样。
在车载场景中,合成器还要处理安全等级。例如仪表报警层必须始终位于最上层,且不能被其他应用遮挡;倒车影像层需要在挂入倒挡后快速切入,并覆盖中控屏的大部分区域。这些规则通常由显示策略服务或窗口管理器配置,合成器只负责执行。
图层属性示例(伪配置):
layer: instrument_warning
z_order: 100
position: (0, 0)
size: 1920x720
alpha: 1.0
blend: premultiplied
secure: true
layer: navigation_map
z_order: 20
position: (200, 100)
size: 1280x600
alpha: 0.95
blend: premultiplied
secure: false
三、缓冲区与帧同步:为什么画面会撕裂或卡顿
如果只有一个缓冲区,应用一边画、屏幕一边读,就会出现上半屏是旧帧、下半屏是新帧的撕裂现象。双缓冲通过前台缓冲和后台缓冲交替解决撕裂,但若交换时机与 VSync 不匹配,仍可能产生卡顿。三缓冲进一步增加一个缓冲,让 GPU 在等待 VSync 时仍有任务可做,但会引入一帧左右的延迟。
帧同步的关键是“对齐节拍”。VSync 是显示器的垂直同步信号,Fence 是 GPU 完成渲染的同步点,Present 是合成帧提交给显示控制器的时间。三者对齐后,应用在后台缓冲绘制,合成器在 VSync 前完成合成,显示控制器在 VSync 时切换前台缓冲,画面就能稳定输出。
常见误区:把“帧率”等同于“流畅度”。实际上,帧率稳定比帧率高更重要。如果帧同步没做好,即使平均帧率很高,也会出现周期性卡顿或撕裂。车载多屏场景中,不同屏幕的刷新率可能不同(如仪表 60Hz、中控 60Hz、HUD 120Hz),需要为每个显示管线独立配置帧同步策略。
四、案例:倒车影像的合成链路
以倒车影像为例,摄像头输出视频帧到视频表面,该表面被绑定到一个高 Z 序图层,合成器将其与中控屏的导航图层、状态栏图层合并,最终通过中控屏的显示管线输出。挂入倒挡时,系统需要在 200ms 内完成图层切换和首帧显示,否则用户会感到明显延迟。
| 环节 | 关键对象 | 典型参数 | 风险点 |
|---|---|---|---|
| 视频采集 | 摄像头 / 视频表面 | 30fps、YUV | 采集延迟、色彩空间转换 |
| 图层绑定 | 窗口 / 图层 | Z序 90、全屏 | 被其他图层遮挡 |
| 合成 | 合成器 | Alpha 混合、缩放 | GPU 负载过高 |
| 显示 | 显示管线 | 60Hz、VSync | 帧同步错位、撕裂 |
五、复盘:建立“对象—时序”双视角
学习图形合成,建议同时建立两个视角。第一个是对象视角:图层、窗口、表面、缓冲区、合成器、显示管线分别是什么,彼此如何引用。第二个是时序视角:一帧从应用绘制开始,经过缓冲区交换、合成、Present,到最终扫描输出,每个阶段的时间预算和同步点在哪里。