显示服务器

它规定了图形应用(客户端)如何与桌面系统(服务端)进行通信,包括窗口创建、输入事件、图像显示等内容。

当前地位与未来趋势

  • 当前地位: 过去几十年里,Xorg 一直是 Linux 图形界面的绝对主力。几乎所有的经典桌面环境(如 GNOME 和 KDE)默认都构建在 Xorg 之上。
  • 未来趋势: 随着技术的发展,Xorg 的架构显得有些臃肿且难以满足现代的安全与性能需求。现代的 Linux 发行版正在逐步向新的显示服务器协议 Wayland 过渡。

X11

“X11” 是指客户端与显示服务器通信所使用的协议名称。X11 中的 11 是指 X 协议的第11个版本,而且是目前的最新版本。

Xorg(通常称为 X.Org Server)是由 X.Org 基金会维护的 X11(X Window System) 的官方参考实现和开源版本。也是 Linux 及其他类 Unix 系统中最主流的显示服务器之一。

X11 最初并不是为现代桌面环境设计的,因此随着桌面特效、高 DPI、多显示器等需求的发展,许多功能都是通过扩展协议逐步加入的。

因此,现代 X11 桌面通常由多个组件共同组成:

  • X Server:负责窗口、输入设备和基础图形服务。
  • Window Manager:负责窗口移动、缩放、装饰等管理功能。
  • Compositor:负责窗口合成、透明、阴影和动画等视觉效果。

这种模块化设计具有较好的兼容性和可扩展性,但也使整体架构相对复杂,组件之间需要频繁协作。

基本架构

flowchart TD
C["Client<br/>应用程序(Qt、GTK、游戏等)"]
X["X Server (Xorg)<br/>窗口管理、输入处理"]
K["Compositor<br/>窗口合成、动画、特效"]
D["Display<br/>显示器"]

C <-->|X11 Protocol| X
X -->|窗口内容| K
K -->|合成结果| X
X -->|最终画面| D

交互

X11 采用经典的 Client / Server 通信模型:

  • X 服务器(X Server): 就是 Xorg。它直接控制物理设备。
  • X 客户端(X Client): 比如你的浏览器、终端或文本编辑器。它们本身不直接与硬件交互,而是向 X Server 发送指令(比如”在坐标 (10,10) 绘制一个按钮”)。

Client 通过 DISPLAY 环境变量定义的 socket 文件与 X Server 进行通信,通常内容是 :0 这种格式,从0开始自增,并且使用 ~/.Xauthority 文件进行认证。

协议特点

X11 诞生于 1984 年,其设计目标是支持网络透明(Network Transparency),因此协议中包含了大量绘图和窗口管理相关的功能。

其主要特点包括:

  • Client / Server 架构:应用程序通过 X11 协议与 X Server 通信,由 X Server 负责管理窗口和输入设备。
  • 网络透明:客户端和 X Server 可以运行在不同的主机上,通过 TCP 或 Unix Domain Socket 进行通信。
  • 协议功能丰富:协议内置了大量绘图命令(如画线、填充矩形、绘制文本等),客户端可以请求 X Server 完成绘制。
  • 绘图由 X Server 执行:传统 X11 中,大部分图形操作由 X Server 完成;现代应用通常借助 OpenGL、Vulkan 等技术自行渲染,再通过扩展与 X Server 协作。
  • 扩展机制完善:通过 Extension 扩展协议不断增加功能,例如:
    • Composite(窗口合成)
    • XRender(2D 渲染)
    • GLX(OpenGL 支持)
    • RandR(显示器管理)
    • XInput2(输入设备)
  • 窗口管理独立:窗口管理器(Window Manager)和合成器(Compositor)均不是 X Server 的一部分,而是运行在独立进程中,通过 X11 协议协同工作。

Wayland

Wayland 是一套现代显示服务器协议。

与 X11 类似,Wayland 指的是客户端与服务端之间通信所使用的协议,而真正运行在系统中的服务端通常称为 Wayland Compositor。

常见的 Wayland Compositor 包括:

  • KWin(KDE Plasma)
  • Mutter(GNOME)
  • Sway
  • Hyprland

与 X11 中 X Server、Window Manager、Compositor 相互独立不同,Wayland 将这些职责统一交由 Compositor 完成。

由于 Compositor 同时承担了显示服务器和窗口管理的职责,Wayland 的整体架构相比 X11 更加简洁。

因此,一个 Wayland Compositor 通常同时承担:

  • Wayland Server(协议服务端)
  • Window Manager(窗口管理)
  • Compositor(窗口合成)

基本架构

flowchart TD
C["Client<br/>应用程序(Qt、GTK、游戏等)"]
S["Compositor(Wayland Server)<br/>管理窗口、处理输入、合成画面"]
D["Display<br/>显示器"]

C <-->|Wayland Protocol| S
S -->|最终画面| D

交互

Wayland 采用经典的 Client / Server 通信模型:

  • Client 向 Compositor 发送 Request(请求)。
  • Compositor 向 Client 发送 Event(事件)。
  • 双方通过本地 Unix Domain Socket 交换协议消息。

整个交互过程可以简单理解为:

  • Client 连接到 Compositor。
  • Client 请求创建窗口。
  • Client 自己完成界面绘制。
  • Client 将绘制结果提交给 Compositor。
  • Compositor 将多个窗口合成为最终画面,并显示到屏幕上。
  • 当用户操作键盘、鼠标等输入设备时,Compositor 将对应事件发送给 Client。

客户端通过 WAYLAND_DISPLAY 环境变量与服务器通信,通常它是 wayland-0 这样的名称,该文件是一个 socket 文件,客户端会通过 XDG_RUNTIME_DIR 环境变量的路径查询到该文件。

协议特点

Wayland 与传统的 X11 最大的区别在于,它只定义通信方式,而不负责具体的绘图。

其主要特点包括:

  1. 协议简单:只定义客户端与服务端之间的通信规则。
  2. 客户端负责绘制:应用程序自行完成界面渲染。
  3. Compositor 负责显示:统一管理窗口并完成最终画面合成。
  4. 异步通信:客户端发送请求,服务端发送事件,双方互不阻塞。
  5. 可扩展:窗口管理、剪贴板、拖放等功能都通过扩展协议实现。

窗口管理器

窗口管理器(Window Manager,简称 WM)是控制图形用户界面中软件窗口位置、外观和交互方式的系统软件。 它决定了你的应用窗口如何排列、是否有边框、如何最大化或最小化,以及如何用鼠标或键盘调整大小。

核心功能

  1. 窗口边框:绘制窗口的标题栏、关闭/最小化按钮和外框。
  2. 位置管理:控制新窗口打开时的默认屏幕位置。
  3. 尺寸调整:处理拖动边缘改变窗口大小的交互。
  4. 堆叠顺序:管理多个窗口重叠时的上下遮挡关系。

主要分类

  1. 堆叠式(Stacking/Floating):窗口像桌上的纸张一样可以互相重叠、自由拖动。这是 Windows 和 macOS 的默认行为。
  2. 平铺式(Tiling):窗口像地板砖一样紧密排列,绝不重叠。代表软件有 i3wm 。
  3. 组合式(Compositing):为每个窗口提供独立的缓冲内存,能实现透明、阴影和动效。例如 Windows 的 桌面窗口管理器 (DWM)。

与桌面环境(DE)的区别

窗口管理器只是桌面环境的一部分。

  • 窗口管理器:只管窗口(如放置、缩放)。
  • 桌面环境(Desktop Environment):是一个完整的全家桶。它集成了窗口管理器,并打包了任务栏、桌面壁纸、文件管理器、系统设置和图标外观(例如 GNOME 桌面环境集成了 Mutter 窗口管理器)。

合成器

合成器(Compositor)负责将多个应用窗口组合(Composite)成最终的桌面画面,并输出到显示器。

X11 与 Wayland 都使用合成器,但两者的架构完全不同。

X11

最初的 X11 并没有合成器的概念,窗口直接由 X Server 绘制到屏幕。后来为了实现窗口透明、动画、阴影等现代桌面效果,又引入了 Composite Extension,使 Compositor 能够获取各窗口内容并进行重新合成。

启用合成器后,会通过 Composite Extension将所有应用窗口重定向到离屏 Pixmap,再利用 GLX/EGL 将这些 Pixmap 绑定为 OpenGL 纹理。随后,合成器在 GPU 上完成窗口画面的合成、透明、阴影、动画等特效处理,并将最终结果绘制到 Composite Overlay Window(或对应的输出缓冲区),最后由 X Server 将合成后的画面显示到屏幕上。

flowchart TB

subgraph Client["应用程序"]
A1["Firefox"]
A2["Terminal"]
A3["Qt App"]
end

subgraph XServer["X Server"]
B1["普通 X11 窗口"]
B2["Composite 扩展"]
B3["窗口 Pixmap"]
B4["Damage 事件"]

B5["Composite Overlay Window"]
B6["Present / SwapBuffers"]
B7["Scanout"]
end

subgraph Composite["合成器"]
C1["导入 Pixmap"]
C2["OpenGL Texture"]
C3["OpenGL 合成"]
C4["窗口动画"]
C5["阴影 / 模糊"]
C6["Framebuffer (FBO)"]
end

subgraph Display["显示器"]
D1["Monitor"]
end

Client --> B1
B1 --> B2
B2 --> B3

B4 -.Damage.-> C3

B3 --> C1
C1 --> C2
C2 --> C3

C3 --> C4
C3 --> C5

C4 --> C6
C5 --> C6

%% 回到 X Server
C6 --> B5
B5 --> B6
B6 --> B7
B7 --> D1

特点

  • X Server 负责窗口管理、输入处理以及窗口缓冲区管理,但并不负责现代窗口特效。窗口透明、阴影、动画等效果由 Compositor 通过 Composite Extension 获取窗口内容后完成。
  • 两者需要频繁交换窗口内容,增加了数据传递开销。
  • 应用客户端 (Client):如 Chrome、VS Code。它们不直接操作屏幕,而是向 X Server 发送绘图请求。

局限

  • 延迟与撕裂:数据在Client、X Server、Compositor 之间来回打包传递,极易造成明显的输入延迟(游戏玩家尤为敏感)。
  • 多显示器硬伤:X11 把所有显示器虚拟成一张巨大的画布,合成器只能以统一的刷新率刷新整张画布,导致”高刷屏”极易被”低刷副屏”强行拖低刷新率。

Wayland

客户端完成渲染后,只需将绘制好的 Buffer(共享内存或 GPU Buffer)提交给 Compositor。Compositor 接收各个窗口的 Buffer,在 GPU 上完成窗口排序、透明、阴影、动画等特效,然后直接输出到 DRM/KMS,最终显示到屏幕。

整个过程中,不再需要 Composite Extension、Pixmap 或 Composite Overlay Window,因此数据流更加直接。

flowchart TB

subgraph Client["应用程序"]
A1["Firefox"]
A2["Terminal"]
A3["Qt App"]
end

subgraph Wayland["Wayland Compositor"]
B1["Wayland Protocol"]
B2["Surface"]
B3["Buffer (SHM / DMA-BUF)"]
B4["OpenGL / Vulkan 合成"]
B5["窗口动画"]
B6["阴影 / 模糊"]
B7["Framebuffer"]
end

subgraph Kernel["Linux Kernel"]
C1["DRM / KMS"]
end

D["显示器"]

A1 -->|commit Buffer| B1
A2 -->|commit Buffer| B1
A3 -->|commit Buffer| B1

B1 --> B2
B2 --> B3
B3 --> B4

B4 --> B5
B4 --> B6

B5 --> B7
B6 --> B7

B7 --> C1
C1 --> D

相比 X11,Wayland 将职责统一到一个组件中,因此整体架构更加简洁。

特点

  • Compositor 即显示服务器:负责窗口管理、输入处理、窗口合成以及最终画面输出,不再需要独立的 X Server。
  • 客户端直接提交 Buffer:应用程序自行完成渲染,仅将绘制完成的 Buffer 提交给 Compositor,而不是发送大量绘图命令。
  • 数据流更加简单:窗口内容无需在 X Server 与 Compositor 之间反复传递,减少了中间环节。
  • 天然支持现代显示特性:每个输出设备(Output)可以拥有独立的刷新率、分辨率和缩放比例,更适合高刷新率、多显示器和 HiDPI 场景。
  • 协议职责更清晰:Wayland 协议只负责客户端与服务端之间的通信,不规定绘图实现,便于不同 Compositor 根据需求实现自己的渲染流程。

局限

虽然 Wayland 在架构上更加现代,但由于其设计理念与 X11 不同,也带来了一些新的挑战。

  • 兼容性问题:大量基于 X11 的应用需要通过 XWayland 兼容层运行,部分应用可能无法获得 Wayland 的全部特性。
  • 远程显示能力较弱:X11 协议天生支持网络透明,而 Wayland 将远程桌面交由 PipeWire、RDP、VNC 等其他协议实现,因此整体方案更加分散。
  • 协议高度依赖扩展:窗口管理、桌面协议等大量功能通过扩展协议(如 xdg-shell)提供,不同 Compositor 支持的扩展可能存在差异。
  • 部分高级功能实现方式改变:例如全局快捷键、屏幕录制、输入法等功能通常需要桌面环境或 Portal 提供支持,而不像 X11 那样可以直接访问显示服务器。

扩展阅读

https://201.ustclug.org/advanced/desktop Linux 桌面与窗口系统