「Xinerama」- 模块交互原理

认识

想象一下,有两台显示器,一台放在左边,一台放在右边。通常情况下,X11 会将它们视为两个完全独立的“屏幕”,进而我们的鼠标无法在两个屏幕之间移动,窗口也无法从一个屏幕拖到另一个屏幕。

Xinerama 是项允许将多个独立的物理显示器合并成一个单一、虚拟大桌面的老旧技术。所以,当今天听到 Xinerama 时,基本上可以将其理解为 Linux 多显示器发展史上的一个重要遗迹。

组成

拼接显示器技术

Xinerama 的作用就是“欺骗”操作系统和应用程序,让它们认为这两个物理显示器其实是一个超大桌面的一部分。这个虚拟桌面的宽度是两个显示器宽度之和,高度则以最高那个显示器的高度为准。

  • 物理状态:两个独立的显示器。
  • 逻辑状态(Xinerama 启用后):一个 3840×1080 的虚拟桌面(假设两个显示器都是 1920×1080)。

技术背景与定位

  • 属于 X11 体系:Xinerama 是 X Window System 的一个扩展,具体来说是 X11 的一个扩展。
  • 老旧技术:它是在多显示器还不是很普遍的年代开发的。它的设计相对简单,主要解决的是“拼接”问题。
  • 与“双头显示”的关系:在早期,一张显卡支持两个输出(即“双头”)是比较高级的功能。Xinerama 是实现这种多显示器设置的主流方式之一。

性质

  • 无缝体验:窗口可以自由地在多个显示器之间拖动,鼠标也可以无边界移动。
  • 跨显示器最大化:你可以将一个窗口最大化,使其铺满所有显示器,形成一个超宽的显示区域。
  • 应用兼容性:针对应用程序来说,它只看到了一个巨大的桌面,因此大多数程序无需做任何修改就能正常工作。

改进

缺点 and 局限性

  • 性能问题:Xinerama 是在 X Server 层面实现的,所有涉及跨显示器的渲染操作(比如拖动一个窗口跨越两个屏幕)都可能需要经过主 X Server 处理,可能导致性能瓶颈,尤其是在使用硬件加速时。
  • 混合输出模式困难:由于它创建的是一个统一的虚拟桌面,所有显示器的刷新率必须相同。你很难让一个 60Hz 的显示器和另一个 144Hz 的显示器在 Xinerama 模式下都以各自的原生刷新率工作。
  • 无法独立设置:你无法为合并后的虚拟桌面中的某个“区域”(即某个物理显示器)单独设置色彩深度、刷新率(如上所述)等。
  • 对现代显卡支持不佳:现代显卡(尤其是 NVIDIA 和 AMD)有自己更先进的、绕过 Xinerama 的多显示器技术。

现代替代品:RandR

由于 Xinerama 的种种局限性,一个更现代、更灵活的技术取代了它,那就是 RandR 技术。其为当前 Linux 桌面环境管理多显示器的标准和推荐方式。

现在,当使用现代桌面环境(例如,GNOME, KDE Plasma, Ubuntu,……)时,其背后的图形设置工具几乎都是在使用 RandR 来管理你的显示器。

RandR 与 Xinerama 的主要区别:

特性 Xinerama RandR
架构 X Server 扩展,创建单一虚拟屏幕 动态配置和管理多个独立屏幕
性能 相对较差,跨屏操作有开销 更好,由驱动和硬件直接管理
灵活性 差,所有显示器必须同步 极高,每个显示器可独立设置分辨率、刷新率、旋转
混合刷新率 不支持 支持
热插拔 支持不佳,通常需要重启 X 完美支持
命令行工具 通常通过 `xorg.conf` 文件配置 `xrandr`

如何判断和使用?

  • 检查当前状态:
在终端输入 xrandr,如果看到多个以 CONNECTED 开头的行,并且它们有不同的名称(如 HDMI-1,DP-1),说明你正在使用 RandR。

如果使用 xinerama,可能需要通过 xdpyinfo 等命令来查看。

  • 启用 Xinerama:
强烈不推荐,除非你有非常特殊的遗留需求。启用它需要在 X11 的配置文件 /etc/X11/xorg.conf 或 /etc/X11/xorg.conf.d/ 下的某个文件中添加 Section,并设置 Option “Xinerama” “on”。对于绝大多数用户,让系统自动通过 RandR 管理是最好的选择。