【发布时间】:2020-02-14 18:26:42
【问题描述】:
我有一个 Java 应用程序,它可以利用 Linux X 服务器描述的多个物理监视器作为单独的屏幕或一个逻辑帧缓冲区(即 TwinView 或 Xinerama),但相同的硬件表示不可用在任何 VNC 服务器实现 AFAIK 中。我真的很想了解 VNC 或 RFB 中阻止逻辑屏幕被表示为具有多个显示器的物理 X 服务器的限制因素是什么。
可能我忽略了一些可以做到这一点的东西?
我知道,如果我正在编写 C/C++ 代码,我可以利用 Xlib API 并连接到多个 VNC 服务器实例,但我坚持 Java 的限制,即每个 JVM 只能连接到单个 X 服务器,如所述 @ 987654321@每缺乏响应。
我也知道我可以用多个显示器的帧缓冲区的宽度来实例化单个 VNC 服务器。这种方法需要代码更改相邻帧/窗口的位置,并且与在物理硬件上渲染不同。
如果您可以像下面这样启动 VNC 服务器,那将是理想的:
Xvnc :1 -geometry 1920x1080 -geometry 1920x1080
结果将是一个 3840x1080 的帧缓冲区,但当 Java 代码如下时会返回多个 GraphicsDevice:
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gd = ge.getScreenDevices();
for(int i = 0; i < gd.length; i++){
System.out.println(gd[i]);
}
vncviewer 不需要关心逻辑屏幕,它只需要将扩展帧缓冲区表示为 3840x1080。
【问题讨论】:
-
我确实发现带有 CentOS 8.0 的 TigerVNC 1.9.0 具有定义屏幕的功能,而 Java 似乎接受了配置。这是一个例子: Xvnc :1 -screen 0 1920x1080x24 -screen 1 1920x1080x24 +xinerama