2. X11架构回顾
要理解从 X11 迁移到 Wayland 的必要性,必须先回到 X11 的原始设计。X11 诞生于 1984 年,它的核心目标不是“画一个现代桌面”,而是“让图形程序与显示设备解耦”。这个目标决定了 X11 的架构:它把显示、输入、窗口管理、合成、渲染拆成多个可替换的角色,通过一条网络协议连接起来。理解这些角色及其边界,是后续判断“哪些能力可以迁移、哪些必须重写”的基础。
核心角色与数据流
X11 的架构可以用一句话概括:X Client 通过 X Protocol 向 X Server 发送绘图与输入请求,X Server 负责与硬件交互,窗口管理器和合成器作为特殊 Client 参与窗口布局与画面合成。下面这张图展示了各角色之间的连接关系与数据流向。
X Protocol:一切皆请求
X Protocol 是 X11 架构的“神经系统”。它定义了 Client 与 Server 之间的二进制消息格式,包括请求(Request)、回复(Reply)、事件(Event)和错误(Error)。所有绘图操作、窗口创建、属性设置、输入事件都通过这条协议传递。这意味着 X11 天然支持网络透明:你可以在本地运行 X Server,在远程服务器上运行 X Client,图形界面通过网络传输。
但网络透明也带来了代价。每个绘图操作都要经过协议编码、传输、解码,Server 端还要维护大量状态。现代应用频繁重绘、动画、视频播放时,X Protocol 的请求-回复模式容易成为瓶颈。Wayland 则把协议设计为更紧凑的异步消息,并允许客户端直接使用共享内存和 GPU 缓冲区,减少往返开销。
# 查看当前 X Server 支持的扩展
xdpyinfo | grep -A 30 "number of extensions"
# 典型输出片段
XRender (opcode 140) Render extension
XComposite (opcode 141) Composite extension
XInputExtension (opcode 131) Input extension
DAMAGE (opcode 143) Damage extension
XFIXES (opcode 144) XFixes extension
窗口管理器与合成器:两个特殊 Client
在 X11 中,窗口管理器(WM)和合成器(Compositor)都不是 X Server 的内置组件,而是以普通 X Client 的身份运行。WM 负责窗口的布局、装饰、焦点策略、工作区切换;合成器负责把各个窗口的离屏内容合成为最终画面,并实现阴影、透明、动画等效果。
这种“外挂式”设计带来了灵活性:你可以更换不同的 WM(i3、Openbox、KWin、Mutter),也可以选择是否启用合成器。但它也带来了协调问题。WM 和合成器之间没有强制的统一接口,很多行为依赖 EWMH 等约定。Wayland 则把合成器提升为显示服务器的核心,窗口管理逻辑通常内置于合成器中,减少了角色之间的协商成本。
扩展:X11 的现代化补丁
X11 核心协议诞生于 1980 年代,很多现代桌面能力是通过扩展补丁实现的。下表列出了迁移中最常涉及的扩展及其作用。
| 扩展 | 核心作用 | Wayland 对应机制 |
|---|---|---|
| XRender | 抗锯齿、Alpha 混合、渐变、现代字体渲染 | 客户端直接使用 GPU 渲染,合成器处理混合 |
| XComposite | 将窗口重定向到离屏缓冲区,供合成器读取 | 合成器原生管理窗口缓冲区,无需重定向 |
| XInput | 多指针、触摸板手势、设备热插拔事件 | libinput + Wayland 输入协议 |
| DAMAGE | 通知合成器哪些区域需要重绘 | 帧回调与缓冲区提交机制 |
| XFIXES | 光标、区域、选择剪贴板等辅助功能 | Wayland 协议中的 wl_pointer、wl_data_device |
案例:一个窗口从创建到显示
假设你在 X11 下启动一个 GTK 应用,并点击窗口中的按钮。整个过程大致如下:
- GTK 应用作为 X Client 连接 X Server,通过 X Protocol 创建顶层窗口。
- 窗口管理器收到 MapRequest 事件,决定窗口位置和装饰,发送 ConfigureRequest。
- 应用在窗口内绘制按钮,绘图请求通过 X Protocol 发送到 X Server。
- 如果启用了合成器,XComposite 将窗口内容重定向到离屏 Pixmap。
- 合成器读取 Pixmap,使用 XRender 进行混合,最终提交到屏幕。
- 用户点击按钮,X Server 产生输入事件,通过 X Protocol 分发给应用。
这个流程中,应用、WM、合成器、X Server 四方都在参与。任何一方出现延迟或状态不一致,都可能导致画面撕裂、输入延迟或窗口闪烁。Wayland 通过合并角色、减少协议往返、允许客户端直接提交缓冲区,显著简化了这条链路。
常见误区与复盘
- 误区一:X Server 就是显示服务器,WM 和合成器是它的组件。实际上 WM 和合成器都是独立进程,以 X Client 身份运行,可以随时替换或关闭。
- 误区二:X11 的扩展是可选装饰。XRender、XComposite、XInput 已经是现代桌面的基础能力,缺少它们会导致字体模糊、无法合成、触摸板失效。
- 误区三:Wayland 只是“另一个 X Server”。Wayland 不是 X11 的替代实现,而是重新设计了客户端与显示服务器之间的职责边界。
- 误区四:Xwayland 可以解决所有兼容问题。Xwayland 让 X11 应用在 Wayland 会话中运行,但它仍然经过 X Protocol 转换,无法获得 Wayland 原生的低延迟和多屏缩放优势。
复盘来看,X11 的架构在历史上非常成功,它用协议解耦了应用与硬件,用扩展补丁延续了生命力。但它的角色过多、协议往返频繁、状态分散,使得现代桌面在性能、安全性和多设备适配上遇到瓶颈。迁移到 Wayland 的核心工作,就是把这些分散的职责重新收敛到合成器与客户端之间更直接的契约中。