wayland 在 2023 的实际体验

关于 wayland 的一些问题和相关配置

这篇文章主要关于我在使用 wayland 时遇到的一些问题和相关配置,主要是一些软件的配置,以及一些问题的解决方案。

首先, 我们要了解 wayland 是什么而我为什么要使用 wayland。

什么是 wayland

根据 archwiki 的解释:

Wayland is a display server protocol. It is aimed to become the successor of the X Window System.
Wayland 是一个显示服务器协议,它的目标是成为 X Window System 的继承者。

显示服务器又是什么呢? 显示服务器是位于图形界面和内核之间的一个软件,它负责接收来自应用程序的图形数据,然后将其转换为内核能够理解的数据,并将其发送给内核,内核再将其发送给显卡,显卡进行具体的渲染工作。

显示服务器协议本质上是一种通信协议,它规定了应用程序和显示服务器之间的通信方式,以及应用程序和显示服务器之间的通信内容。

旧有的 X Window System 是由 X.org 基金会管理的显示服务器开源实现,它通过 x11 协议与应用程序进行交互, X Window System 负责管控所有窗口的所有控件, 几十年发展下累计了各种补丁和问题, 其对于现代 linux 来说, 有些过于臃肿庞大。

于是 wayland 应时而生, 它的显示服务器(又名 Compositor)规定让客户机(应用程序)自身负责窗口边框和装饰等的绘制和处理输入, 窗口管理器简化为显示管理服务, 仅负责窗口算绘屏幕上的程序。

这里以 wikipedia 上的例子, 说明 Wayland 相比于 X 的高效设计的具体体现:

以一次 “鼠标点击按钮引发按钮更新动作为例子”:
在 X 中:

  1. 内核捕获鼠标点击事件并发送给X server。
  2. X server会计算该把这一事件发送给哪个窗口(事实上,窗口位置是由Compositor控制的,X server并不能够正确的计算Compositor做过特效变化之后的按钮的正确位置)。
  3. 应用程序对此事件进行处理(将引发按钮更新动作)。但是,在此之前它得向X server发送绘制请求。
  4. X server接收到这条绘制请求,然后把它发给视频驱动来渲染。X还计算了更新区域,并且这条“垃圾信息”发送给了Compositor。
  5. 这时,Compositor知道它必须要重新合成屏幕上的一块区域。当然,这还是要向X server发送绘制请求的。
  6. 开始绘制。但是X server还会去做一些不必要的本职工作(窗口重叠计算、窗口剪裁计算等)。

在 Wayland 中

  1. 内核捕获鼠标点击事件并发送给Wayland Compositor。
  2. 由于是直接发给Wayland Compositor的,所以Wayland Compositor会正确地计算出按钮的位置。同时它会把这一事件发送给按钮所在的应用程序来处理。
  3. 应用程序直接渲染,无需向Wayland Compositor请求。只需在绘制完成之后向Wayland Compositor发送一条信息表明这块区域被更新了。
  4. Wayland Compositor收到这条信息后,立即重新合成整个桌面。

wayland 拥有更好的性能(简化架构, 简化图形堆栈, 设计更集中), 更高的安全性(应用程序之间相互独立), 更好的支持现代图形特性

有关 wayland 的配置

尽管 wayland 有上述的各种优势, 但受限于兼容问题, 其实际的体验还受到多多限制, 尽管在日常使用上已经基本没什么问题, 但在某些地方还待完善和改进

我目前使用的是 KDE 桌面环境, KDE 在对于 wayland 的支持上还是十分热心的, 目前社区中许多 Wayland 的适配中都能看到 KDE 开发人员的贡献, 而为何不使用诸如 hyprland 等备受好评的平铺式 Compositor, 只能说其在某些领域(比如 electron)等的表现还不太能令人满意

关于 nvidia 显卡

相比几年前, nvidia 终于提高了他们对 wayland 的驱动支持力度, 目前在驱动问题上, 只需要一些简单的配置就能得到非常不错的 wayland 体验

以下针对使用 grub 启动的 archlinux 环境:

安装好显卡对应的驱动后, 编辑 /etc/environment, 添加以下环境变量:

1
2
3
4
5
6
7
GBM_BACKEND=nvidia-drm # 使用 nvidia 的 gbm 后端
__GLX_VENDOR_LIBRARY_NAME=nvidia # openGL 使用 nvidia 的库
ENABLE_VKBASALT=1 # 开启 vulkan 的后处理
LIBVA_DRIVER_NAME=nvidia # 使用 nvidia 的 vaapi 驱动
GDK_BACKEND=wayland # GTK 支持
QT_QPA_PLATFORMTHEME="wayland;xcb" # QT 支持
KWIN_DRM_USE_EGL_STREAMS=1 # 使用 EGLStream 作为 kwin 的渲染后端

然后, 编辑 /etc/default/grub, 找到 GRUB_CMDLINE_LINUX_DEFAULT,为其添加参数 nvidia-drm.modeset=1

然后重新生成一下 grub 的 config

1
sudo grub-mkconfig -o /boot/grub/grub.cfg

编辑 /etc/mkinitcpio.conf, 在 MODULES 中添加 nvidia nvidia_modeset nvidia_uvm nvidia_drm

然后

1
sudo mkinitcpio -P

重启即可

另外, 有双显卡的最好使用混合显卡

关于 kde

关于 kde, 只需要安装 plasma-wayland-session plasma-wayland-protocols qt5-wayland qt6-wayland xorg-xwayland 等包即可

从 Xwayland 到 Wayland

Xwayland 是对于某些还不能支持 wayland 协议的应用提供允许其在wayland 上运行 X11 应用程序的支持, 但对于那些已经支持 wayland 的应用, 为什么我们不使用它呢 ?

首先是 Firefox

设置环境变量 MOZ_ENABLE_WAYLAND 为 1 即可

然后是 electron 应用(包括 chrome)(还有 linux QQ, wechat-uos 等等)

/usr/share/application 中对应的启动参数添加

1
2
--enable-features=UseOzonePlatform
--ozone-platform=wayland
小贴士

可以使用 xeyes 小眼睛看该应用程序是否使用 wayland 协议, 如果是, 眼睛就不会动

关于输入法

参考 Chrome/Chromium 今日 wayland 支持现状 下方评论(文章中反应的部分问题已在今天得到解决), KDE 下的 QT, GTK, Chrome 等应用均可使用 fcitx5 输入法

在 KDE 使用输入法及其简单, 在设置的虚拟键盘中选择 fcitx5 即可

对于 Chrome 系应用在这里要做说明, 在 xwayland 下基本能正常使用输入法, 但在 wayland 下, 需要添加启动参数 --enable-wayland-ime 才可以

截屏

wayland 下不能使用 flameshot, 其截屏配置起来十分麻烦, 但我在 KDE 下找到了相应的应用程序, spectacle, 设置好相应快捷键后还是十分顺滑的

体验效果

在实际体验上, 相比 X, wayland 的动画效果十分流畅, 高刷新屏幕下可以得到非常好的体验, 而在笔记本上的电池耗电更是显著下降,就个人而言,在 X 下的耗电不如 windows, 两个小时以内就能将我的 r7000p 榨干, 而在 wayland 下, 实际续航在同等工作强度下可以支持三个小时以上

总结

从 08 年到 23 年, wayland 用 15 年时间稳步接近其目标, 为现代 linux 系统的发展奠定了坚实基础, 我相信在不久的将来, wayland 将会成为 linux 图形化的主流, 为 linux 的现代化, 高效化, 安全化提供更好的支持

另外, wayland 的高效使其能够为低端廉价设备提供图形化支持, 为 linux 在嵌入式领域的进一步发展提供了可能


wayland 在 2023 的实际体验
https://iku50.github.io/2023/12/06/wayland in 2023/
作者
iku50
发布于
2023年12月6日
许可协议