Overview
参考文档:Arch Wiki — Wayland
Linux桌面把"画面如何到屏幕"拆成了两层:显示协议定义应用与显示服务端如何对话,图形栈负责渲染与上屏:flowchart TD A["应用(浏览器/游戏/Android 容器...)"] -->|"Wayland 协议 / X11 协议"| B["合成器(显示服务端:mutter / KWin / Hyprland / sway ...)"] B -->|"EGL / Vulkan"| C["Mesa / NVIDIA 驱动"] C -->|"DRM/KMS"| D["屏幕"]X11是服役近四十年的老协议,Wayland是现代替代者;如今主流发行版默认会话都是Wayland,但两者仍长期共存
X11 与 Wayland
X11(X Window System):- 客户端/服务端架构,
X Server集中管理输入与输出,应用通过套接字与之通信 - 历史包袱:协议本身不支持的安全模型(任意应用可截获其他应用的输入与画面)、撕裂、HiDPI 与多显示器支持不力,都是
Wayland出现的直接原因
- 客户端/服务端架构,
Wayland:- 把"显示服务端"与"合成器"合为一体:每个
Wayland合成器就是显示服务器,应用把各自渲染好的缓冲区提交给合成器,由合成器合成上屏 - 安全性更好(应用只能看到自己的内容)、帧调度由合成器统一控制(撕裂可消除)、多显示器不同刷新率/缩放是协议一等公民
- 代价是大量原本
X Server全局提供的功能(截屏、屏幕录制、输入法、颜色管理等)需要逐个以协议扩展的形式补齐,这也是迁移期阵痛的来源
- 把"显示服务端"与"合成器"合为一体:每个
合成器(Compositor)
- 合成器是
Wayland协议的服务端程序,负责把各应用的画面缓冲合成到屏幕上,同时处理窗口管理、输入分发、多显示器布局 - 生态分布:
- 桌面环境自带:
GNOME的mutter、KDE的KWin - 平铺式窗口管理器:
Hyprland(动画与装饰)、sway(i3的Wayland传承) - 特殊用途:
cage(kiosk 单应用全屏)、gamescope(Valve的嵌套游戏合成器)
- 桌面环境自带:
- 玩游戏最关心的两个能力:
VRR/可变刷新率(FreeSync/G-Sync):mutter、KWin均已支持,撕裂与卡顿感显著降低- 直通扫描(
direct scan-out):全屏独占时跳过合成直接上屏,降低延迟——但合成器介入的帧(如叠加层)会退回合成路径
HDR、多显示器不同刷新率等长期痛点在Wayland合成器上正逐步补齐,体验逐年变好- 嵌套合成器:合成器本身也可以作为另一个合成器的客户端运行(会话里套会话),
gamescope与cage都以此方式嵌在桌面里单独服务某个游戏或容器
wlroots
wlroots是一个实现Wayland合成器通用逻辑的库,可以理解为"造合成器的轮子库":- 封装了
KMS/DRM(显示输出)、EGL/Vulkan渲染、输入设备、XWayland兼容层等脏活,让sway、Hyprland、cage这类独立合成器不必从零实现协议细节 - 主流桌面(
GNOME/KDE)的合成器不基于wlroots,各自维护协议实现;wlroots主要服务于轻量/平铺/特殊用途合成器生态
- 封装了
XWayland
XWayland是运行在Wayland合成器内部的X11兼容服务:X11应用照常连"X Server",而它把绘制结果作为普通Wayland客户端提交合成- 它是过渡期不可或缺的胶水层:大量游戏(尤其
Wine下仅支持X11全屏的老游戏)与遗留应用靠它活在Wayland会话里 - 代价:
XWayland窗口走"应用渲染 →X协议 → 合成"两跳,无法用到Wayland的部分原生能力(如无撕裂的帧调度),wlroots系合成器的XWayland支持质量直接影响这类应用的兼容性
相关阅读
- 在 Linux 上玩游戏:
gamescope如何用嵌套合成器给游戏做缩放与帧率控制 - 在 Linux 上玩安卓游戏:
Waydroid如何作为Wayland客户端直通显示、cage如何给它当 kiosk 画布