柚子/修复Bspwm中遇到的屏幕撕裂和其他显示问题

Created Thu, 17 Nov 2022 00:00:00 +0000 Modified Tue, 17 Dec 2024 05:07:00 +0000
By Yoyo 1286 Words 6 min Edit

前言

我最喜欢的窗口管理器是 Bspwm,它简洁且高效,特别适合喜欢极简和高定制化的 Linux 用户。然而,前段时间我遇到了一个令人头疼的屏幕撕裂问题,经过一系列尝试,包括更新显卡驱动、调整配置等,都未能解决问题。甚至在社区向群友请教后,依然没有得到有效的解答。最终,我不得不暂时放弃,重装回了 Windows 11

但今天,我终于找到了问题的根源和解决方案,现在我又能愉快地使用 Bspwm 了!

问题分析

首先要明确一点,屏幕撕裂的问题并非出自 Bspwm 本身,而是与 Picom 合成管理器的使用有关。Picom 是一个常见的轻量级合成管理器,它能够提供桌面合成效果,比如透明、阴影等,同时也支持垂直同步(VSync),避免因渲染不同步而产生的屏幕撕裂现象。

这个问题的根源是,在使用 Picom 时,可能会遇到一些不兼容或配置上的问题,尤其是当使用默认配置或者没有启用合适的后端时,屏幕撕裂现象更容易发生。

为了更好地理解,屏幕撕裂发生的原因通常是显卡的渲染输出与显示器的刷新率不同步。现代图形驱动通常使用 V-Sync 技术来同步显示帧的渲染和显示,但在某些情况下,Picom 合成管理器和显卡驱动的交互可能会导致这个同步机制失效,进而出现屏幕撕裂的现象。

解决方法

经过一番调试和分析,我发现 Picom 的默认后端可能不支持或不完全适配我的硬件(或驱动),这就是导致屏幕撕裂的罪魁祸首。

幸运的是,Picom 提供了一个 experimental-backends 参数,该参数启用了实验性后端,并改善了与某些显卡和驱动的兼容性,从而解决了屏幕撕裂的问题。具体的解决方法如下:

步骤 1: 启用 --experimental-backends

运行 Picom 时,添加 --experimental-backends 参数来启用这些实验性后端。这样,Picom 会在启动时尝试使用更适配的后端来处理合成,从而避免屏幕撕裂现象的发生。

picom --experimental-backends -b

其中 -b 参数代表后台启动 Picom(即不阻塞终端),确保你在启动时能够继续使用终端进行其他操作。

步骤 2: 配置文件问题

我使用的是 Archcraft 发行版,默认的窗口管理器配置文件 bspwmrc 中并没有包含启动 Picom 的相关命令。经过一番排查,我发现 Picom 的启动命令被写在了另一个文件中——~/.config/bspwm/bin/bspcomp

你可以通过修改 ~/.config/bspwm/bin/bspcomp 文件,确保 Picom 在启动时带上 --experimental-backends 参数,具体修改方式如下:

  1. 打开 ~/.config/bspwm/bin/bspcomp 文件。

  2. 找到启动 Picom 的那一行命令。

  3. 修改命令为:

    picom --experimental-backends -b
    
  4. 保存文件并退出。

步骤 3: 重启窗口管理器

完成上述修改后,重启 Bspwm 或者重新加载配置文件,你就能体验到没有屏幕撕裂的流畅显示效果了。

bspc wm -r

或者直接重启电脑,确保所有配置生效。

为什么 --experimental-backends 有效?

Picom 的渲染后端是它的核心组件之一,不同的后端对硬件的兼容性和性能影响极大。--experimental-backends 选项会启用 Picom 的实验性后端,这些后端通常包含了针对特定硬件或驱动的优化,并能够解决某些显卡或驱动版本的兼容问题。在我的系统上,启用该选项后,合成管理器与显示器的同步得到了有效改善,成功避免了屏幕撕裂。

为什么其他桌面环境没问题?

在我的测试中,使用 GnomeKDE 等其他桌面环境时,并没有遇到屏幕撕裂问题。这是因为这些桌面环境默认启用了合成管理器(如 MutterKWin),并且它们在默认情况下配置了适合大多数硬件的 V-Sync 和合成设置。相比之下,Bspwm 默认没有启用合成管理器,因此需要手动配置像 Picom 这样的合成工具。