3. Wayland基础概念

Wayland 并不是一个“图形库”,而是一套显示服务器与客户端之间的通信协议。在车载显示系统中,仪表、中控、HUD、后排娱乐等应用通常作为 Wayland 客户端运行,而负责统一合成、窗口管理、输入分发和显示输出的进程称为合成器(Compositor)。理解 Wayland 的核心术语,是后续进行多屏布局、输入路由、性能调优和故障排查的基础。

本节核心主线:客户端通过 Wayland 协议把“表面”提交给合成器;表面通过“区域”描述有效像素;像素数据存放在“缓冲区”中;合成器完成合成后送显,并把“输入事件”按焦点和坐标分发给对应客户端。

一、核心术语与整体关系

Wayland 的术语看似零散,实际上围绕“谁画、画什么、画到哪里、怎么显示、如何交互”形成一条完整链路。下面这张关系图展示了协议、合成器、客户端、表面、区域、缓冲区和输入事件之间的连接关系。

Wayland 核心对象与数据流关系 Wayland 协议 接口定义 · 请求/事件 · 对象生命周期 合成器 Compositor 窗口管理 · 合成 · 显示输出 输入分发 · 焦点管理 多屏布局 · 渲染调度 客户端 Client 仪表 · 中控 · HUD · 娱乐 创建表面 · 提交缓冲区 接收输入事件 · 重绘 实现 使用 表面 Surface 可被合成的基本矩形区域 · 有位置、尺寸、变换 区域 Region 有效像素范围 缓冲区 Buffer 像素数据载体 输入事件 Input Event 触摸 · 按键 · 指针 · 焦点 · 坐标变换 管理 创建/提交 描述 绑定 分发 投递 客户端负责“画”,合成器负责“合”与“送显”,协议负责“约定”,输入事件负责“交互”

二、协议:客户端与合成器的“契约”

Wayland 协议本质上是一套接口定义,规定了客户端可以发送哪些请求(request),合成器可以回送哪些事件(event)。协议通过 Unix 域套接字传输,消息中携带对象 ID、操作码和参数。每个对象都有生命周期,创建、使用、销毁都必须遵循协议约定。

在车载系统中,常见的扩展协议包括 wl_surface、wl_region、wl_buffer、wl_seat、wl_output 等。合成器可能还实现了 xdg_shell、ivi_shell 或自定义的私有协议,用于满足车规级多屏、多应用、快速启动等需求。

# 查看当前 Wayland 会话中的协议接口(示意)
wayland-info | grep interface
# 常见输出:
# interface: 'wl_compositor', version: 4
# interface: 'wl_shm', version: 1
# interface: 'wl_seat', version: 7
# interface: 'wl_output', version: 3
# interface: 'xdg_wm_base', version: 2

三、合成器、客户端与表面

合成器是 Wayland 架构的中心。它负责接收多个客户端的表面,按照层级、位置、透明度、裁剪区域进行合成,最终输出到显示控制器。车载合成器还需要处理多屏异显、安全层级、启动动画、倒车影像优先显示等特殊逻辑。

客户端是实际绘制内容的应用。它通过 wl_compositor 创建表面,通过 wl_shm 或 zwp_linux_dmabuf 创建缓冲区,把渲染结果提交给合成器。客户端并不直接访问显示硬件,也不直接读取输入设备,一切通过协议与合成器交互。

表面(Surface)是客户端提交内容的基本单位。一个表面可以理解为一个“可被合成的矩形画布”,它拥有位置、尺寸、变换、缩放、裁剪等属性。仪表盘可能由多个表面组成:背景层、指针层、报警层、文字层,分别提交后由合成器统一合成。

四、区域与缓冲区

区域(Region)用于描述表面中“有效像素”的范围。它由若干矩形组成,常用于输入命中测试、裁剪和损伤区域计算。例如,一个圆形按钮所在的表面,其区域可能只包含按钮的圆形范围,而不是整个矩形,这样点击事件就不会落到透明区域。

缓冲区(Buffer)是像素数据的实际载体。客户端把渲染好的像素写入缓冲区,再通过 wl_surface.attach 和 wl_surface.commit 提交给合成器。缓冲区可以来自共享内存(wl_shm),也可以来自 GPU 的 DMA-BUF,后者在车载高性能渲染中更常见。

术语 作用 车载场景示例 常见接口
协议 Protocol 定义请求与事件规则 仪表与合成器通信 wl_compositor、xdg_wm_base
合成器 Compositor 合成、显示、输入分发 统一管理中控与仪表多屏 Weston、KWin、自定义合成器
客户端 Client 创建表面并提交内容 导航、媒体、车辆设置应用 Qt、GTK、Flutter、自绘引擎
表面 Surface 可合成的基本矩形区域 仪表指针层、报警弹窗层 wl_surface
区域 Region 描述有效像素与命中范围 圆形按钮点击区域 wl_region
缓冲区 Buffer 存放像素数据 GPU 渲染后的帧数据 wl_shm、zwp_linux_dmabuf
输入事件 Input Event 触摸、按键、指针等交互 中控触摸屏点击、方向盘按键 wl_seat、wl_pointer、wl_touch

五、输入事件:从硬件到客户端

输入事件在 Wayland 中由合成器统一接收和分发。合成器从 evdev 或 libinput 获取原始输入,经过坐标变换、焦点判断、命中测试后,再通过 wl_seat 相关接口发送给目标客户端。客户端收到的事件坐标通常是相对于自身表面的局部坐标,而不是屏幕全局坐标。

在车载场景中,输入事件还涉及安全策略:行驶中禁止某些触控操作、倒车时优先响应倒车影像区域、副驾屏与中控屏的输入隔离等。这些逻辑通常由合成器或上层窗口管理策略实现,而不是由单个客户端自行决定。

理解 Wayland 的关键:客户端不直接“画到屏幕上”,而是把表面和缓冲区提交给合成器;合成器决定最终显示结果和输入去向。协议是双方必须遵守的契约。

六、常见误区与复盘

  • 误区一:把 Wayland 当成图形库。Wayland 是协议,不是渲染 API。真正绘制内容的是客户端使用的 OpenGL ES、Vulkan、Skia 或 Qt 等工具。
  • 误区二:认为客户端可以直接读取触摸坐标。客户端只能收到合成器分发的事件,坐标已经过变换和裁剪。
  • 误区三:忽略区域的作用。区域不仅影响裁剪,还影响输入命中测试。区域设置错误会导致点击穿透或点击无效。
  • 误区四:缓冲区提交后立即复用。缓冲区在合成器释放前不能随意改写,否则会出现撕裂或花屏。应关注 wl_buffer.release 事件。
  • 误区五:多屏场景下只考虑一个输出。车载多屏需要为每个输出创建和管理表面,并处理跨屏坐标和焦点切换。
排查显示异常时,优先确认三件事:表面是否成功提交、缓冲区是否被正确释放、输入区域是否与视觉区域一致。多数“黑屏”“点击无效”“画面撕裂”问题都能从这三条链路定位。

掌握协议、合成器、客户端、表面、区域、缓冲区和输入事件这七个核心术语后,后续学习 Wayland 的渲染流程、多屏管理、输入路由和性能优化时,就能把每个问题定位到具体的对象和链路上,而不是停留在“显示不正常”的模糊描述中。