
窗管团队 wiki - 基础知识
显示服务器
它规定了图形应用(客户端)如何与桌面系统(服务端)进行通信,包括窗口创建、输入事件、图像显示等内容。
当前地位与未来趋势
- 当前地位: 过去几十年里,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 |
交互
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 |
交互
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 最大的区别在于,它只定义通信方式,而不负责具体的绘图。
其主要特点包括:
- 协议简单:只定义客户端与服务端之间的通信规则。
- 客户端负责绘制:应用程序自行完成界面渲染。
- Compositor 负责显示:统一管理窗口并完成最终画面合成。
- 异步通信:客户端发送请求,服务端发送事件,双方互不阻塞。
- 可扩展:窗口管理、剪贴板、拖放等功能都通过扩展协议实现。
窗口管理器
窗口管理器(Window Manager,简称 WM)是控制图形用户界面中软件窗口位置、外观和交互方式的系统软件。 它决定了你的应用窗口如何排列、是否有边框、如何最大化或最小化,以及如何用鼠标或键盘调整大小。
核心功能
- 窗口边框:绘制窗口的标题栏、关闭/最小化按钮和外框。
- 位置管理:控制新窗口打开时的默认屏幕位置。
- 尺寸调整:处理拖动边缘改变窗口大小的交互。
- 堆叠顺序:管理多个窗口重叠时的上下遮挡关系。
主要分类
- 堆叠式(Stacking/Floating):窗口像桌上的纸张一样可以互相重叠、自由拖动。这是 Windows 和 macOS 的默认行为。
- 平铺式(Tiling):窗口像地板砖一样紧密排列,绝不重叠。代表软件有 i3wm 。
- 组合式(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 |
特点
- 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 |
相比 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 桌面与窗口系统

