协议设计准则

在大多数 Wayland 的协议设计中已经应用了一些关键性的概念,我们将在此简要介绍它们。在整个上层 Wayland 协议及其扩展协议中都可以找到这些准则(至少在 Wayland 协议中)。如果您正在编写自己当协议扩展,那么聪明的做法是借鉴这些准则。

原子性

Wayland 协议设计中最重要的准则就是原子性。Wayland 的既定目标是“每一帧都是完美的”。为此,大多数接口都允许以事务的方式进行更新,使用多个请求来创建一个新的表示状态,然后一次性提交所有请求。例如,可以在 wl_surface 上配置几个属性:

  • 附加的像素缓冲区
  • 需要重新绘制的变更区域
  • 出于优化而不透明的区域
  • 可接受输入事件的区域
  • 变形,例如旋转 90 度
  • 缓冲规模,用于 HiDPI

该接口为这些请求提供了独立的配置,但它们都处于挂起状态(pending)。仅当提交请求的时候,挂起状态才会合并到当前状态(current)。从而使您可以在单帧内原子地更新所有这些属性。结合其他一些关键性设计决策,Wayland 混成器可以在每一帧中完美地呈现所有内容——没有画面撕裂和窗口部分更新,每个像素都恰如其分地显示。

资源生命周期

另一个重要的设计准则是:避免服务端和客户端向无效对象发送相关事件或请求。于此,通过接口定义的事件和请求具有有限的生命周期,服务端和客户端也可以通过接口对其进行显式释放。只有当两边都先后同意才能释放对象所分配的资源。

Wayland 是一个完全异步的协议。它将保证消息按发送顺序送达,但仅仅针对一个发送者的情况。例如,当客户端决定销毁其键盘设备时,服务端可能会有多个输入事件正在排队。客户端必须正确处理不再需要的对象事件,直到服务端同步。同理,如果客户端在销毁对象前将一些不再需要的请求入队,则服务端必须以正确的顺序发送这些请求,以便在客户端同意销毁该对象后不再对其进行使用。

版本控制