不要混淆实际显示(您的显示器)、X11 服务器(“显示”)以及通过套接字或其他方式访问它的方式:通过 ssh 转发的 DISPLAY=:0 和 DISPLAY=localhost:10 参考相同的显示/xserver、相同的视频卡和相同的监视器。
$DISPLAY
用于启动 X 服务器。是否$DISPLAY
同时指定 X 服务器的监听套接字和渲染目标?如果是,它如何指定两种不同的事物?
$DISPLAY
指定一个套接字。例如 if$DISPLAY
is:40
,它对应一个端口 6040 或一个以 40 命名的 unix 域套接字。是
$DISPLAY
指定 X 服务器的监听套接字的套接字吗?还应该指定一个渲染目标(即X 服务器将在
$DISPLAY
其上渲染某些东西的显示设备或其模拟器)?
是否正确
X client <-> X server <-> rendering target
X 客户端不能直接与渲染目标通信,而是通过 X 服务器间接通信?
谢谢。
不会。X 服务器为 X 客户端提供通信端点。X 客户端通过命令行选项或环境变量选择他们想要与之通信的服务器。从客户端来看,这是它使用的“显示”,因此选项通常
-display
为 ,环境变量为$DISPLAY
,相关库函数名称中带有“显示”。通信既可以通过网络(不安全,而且目前大部分已禁用),也可以在本地进行。提供这两种端点的 unix 构造称为“socket”(请参阅 参考资料
man 2 socket
)。“显示”值编码(1)主机,(2)映射到众所周知的端口号或 unix 域路径(用于本地通信)的显示编号,(3)屏幕编号(今天主要0
是默认情况下,因为大多数 X 服务器不提供多个屏幕),格式为hostname_or_address:display_number.screen_number
.许多客户端可以连接到单个服务器提供的同一个“套接字”,所以
没有意义。
编辑
假设您的意思是“渲染目标”“可以在监视器上显示为图形的某些硬件”,那么是的,这基本上是正确的。
然而,X 服务器并没有以某种方式与“渲染目标”通信,X 服务器独占控制“渲染目标”(通常是显卡上用作帧缓冲区的一块内存,以及一块硬件在一个或多个监视器上显示帧缓冲区,所有这些都通过各种驱动程序和内核层抽象出来)。
同样,这也是原始 X 协议的情况。随着 OpenGL 扩展的出现,X 客户端可以使用 X 协议的扩展来更直接地访问“渲染目标”(GPU 的内核驱动程序),绕过 X 服务器。而今天,大多数应用程序都使用 OpenGL 来加速图形……这就是为什么一旦 X 客户端通过网络连接到另一台机器上的 X 服务器时,您就会失去硬件加速。