远程桌面上的Java渲染

4
我正在尝试通过Windows 7的远程桌面在RHEL7服务器上运行我编写的Java程序。 所有在服务器中的Java程序无法在远程桌面中呈现。如果我在服务器位置上访问该服务器,则它们看起来正常。

enter image description here

我在其他帖子中看到更改NVIDIA颜色方案等可以帮助,但服务器正在使用默认图形。

5个回答

5

我明白了:

  • 在启动远程连接时,打开连接选项。
  • 进入屏幕选项。
  • 选择颜色选项。
  • 选择16位颜色。

完成。


2

当通过RDP连接到Windows 7机器时,可以按以下步骤操作:

  • 在启动远程连接时,打开连接选项;
  • 转到“显示”选项卡;
  • 在颜色中选择高彩色 (15位)

对于我来说,接受的答案不起作用,但指向了这个方向(我想发表评论,但目前我的声望还不够)。


1

退出(而不仅仅是断开)远程会话对我产生了影响。也许这个答案可以帮助那些因为在远程连接后对Java应用程序进行了一些操作而导致出现有趣的超大边框的人。

我使用Mac Parallels软件通过Windows 10进行远程连接。然后我在Parallels上进行了配置更改。然后我在我的Mac上设置了VPN和远程连接,并遇到了问题。我在远程站点上注销并重新登录,问题就变得“正常”了。


1
这个回答扩展了TeamViewer主题上关于“某些应用程序不显示内容(白窗口)Windows 10 host”的解决方案。
请参见下面的“解决方案”。

 

摘要

我注意到这个问题通常与Java应用程序有关,当主监视器不再连接到设备时,比如某些笔记本电脑在关闭盖子时“断开”内置屏幕或工作站没有连接屏幕。

基于有无监视器附加的应用程序行为、图形加速器的表面理解以及我在下面引用的论坛帖子中的经验,我认为无内容窗口的原因是应用程序依赖于DirectDraw或Direct3D子系统 - 它们与3D加速硬件接口 - 当加速器由于断开监视器而被禁用时。

我认为,在Linux环境中使用Wine兼容层运行依赖于3D加速的应用程序时,我也遇到了类似的问题(https://bugs.winehq.org/buglist.cgi?component=directx-d3d&product=Wine&resolution=---)。

也许这是3D图形处理器的节能特性,在未检测到屏幕时会激活;或者这与帧缓冲区不知道支持的输出分辨率有关,从而禁用了Windows外壳对GPU的访问,导致Windows回退到仅软件渲染; 或其他原因。

无论原因是什么,我的假设是当显示器禁用时,专用图形硬件无法用于3D处理,所有遇到问题的软件都共同点是Java,我质疑JVM是否依赖D3D进行渲染,即使Windows只有可用的仅软件渲染。

   

解决方案

参考:https://superuser.com/a/496775

使用DXDiag,我检查了显示DirectX功能的状态:

DirectDraw加速:已启用

Direct3D加速:已启用

AGP纹理加速:已启用

我手动创建了这些注册表值,并创建了Direct3D\Drivers键:

Reg Add HKLM\SOFTWARE\Microsoft\DirectDraw /V EmulationOnly /T REG_DWORD /D %_Mode% /F

Reg Add HKLM\SOFTWARE\Microsoft\Direct3D\Drivers /V SoftwareOnly /T REG_DWORD /D %_Mode% /F

然后,使用DXDiag,我检查了显示DirectX功能的新状态:

DirectDraw加速:已禁用

Direct3D加速:已禁用

AGP纹理加速:不可用

当监视器未连接时,Java程序窗口现在通过VNC Viewer正确呈现内容。

我还没有尝试在SuperUser线程中提到的使用“ForceDirectDrawEmulation”选项在兼容性向导中的建议。

   

研究和参考资料

以下每个标题下记录了作为研究成果的论坛帖子,这些成果导致了上述解决方案。

每个部分都以应用引用线程中提出的解决方案的结果或该线程不适用于我的环境的原因结尾; 但是这些解决方案可能对其他人有用。

 

在Windows显示设置中禁用硬件加速

参考:https://www.auslogics.com/en/articles/disable-hardware-acceleration-in-windows/

未尝试,因为显示设置窗口崩溃。

 

尝试防止GPU(ATI Mobility Radeon HD 4500)在监视器断开连接时禁用硬件加速
参考:https://social.technet.microsoft.com/forums/windows/en-us/8a9b5aa7-fe33-4e6d-b39b-8ac80a21fdc2/disable-monitor-off-detection-how?forum=w7itprogeneral 已禁用“显示检测”,以防止检测到断开连接并避免禁用硬件加速。
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000]
"Display_Detection_DEF"=dword:00000001

创建/空DMMEnableDDCPolling用于ATI显卡 - 参考:NetMage的帖子
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000]
"DMMEnableDDCPolling"=dword:00000000

尽管在重启期间笔记本电脑盖子是关闭的,但没有产生任何影响。即使它起作用了,这也可能不是一个合适的解决方案。更为合适的解决方案是强制启用3D硬件加速,无论监视器检测结果如何。

 

全局禁用Java应用程序的D3D加速(Java控制面板)

参考:https://forums.guru3d.com/threads/disable-hardware-acceleration-for-java.296918/#post-4096709

因为我的系统上没有Java控制面板,所以未尝试。

 

禁用Java应用程序的D3D加速(环境变量)

参考资料:https://dev59.com/JZTfa4cB1Zd3GeqPWNTE#36235217

Java 2D的系统属性:http://docs.oracle.com/javase/8/docs/technotes/guides/2d/flags.html

设置用户环境变量:

_JAVA_OPTION=-Dsun.java2d.d3d=false -Dsun.java2d.noddraw=true

J2D_D3D=false

如果这个方法有效的话,那么它将是理想的解决方案,因为它是针对Java特定配置的,与上面提出的解决方案相比,后者需要进行完整的系统更改以弥补Java特定问题。然而,设置环境变量并没有解决我遇到的空白窗口问题。也许JRE 8的文档已经过时了,新版本可能有其他可用的方法。一旦我意识到解决方案,我就没有去寻找更新的文档或替代方案。

 

在Windows 7上禁用Direct3D加速

参考:如何在Windows 7上禁用Direct3D加速?

directx.cpl指南-更改32位DirectDraw和Direct3D,但不包括64位(dxdiag 32/64位):https://stackoverflow.com/a/25508331

我没有运行32位版本的Windows 7

 

在Windows 8/10上禁用DirectDraw和Direct3D加速

参考链接: https://superuser.com/questions/495303/how-do-i-disable-directdraw-and-direct3d-acceleration-on-windows-8

directx.cpl指南 - 更改32位DirectDraw和Direct3D,但不包括64位(dxdiag 32/64位): https://superuser.com/a/504510

我正在运行64位版本的Windows 10,Java应用程序也是64位的,因此32位DirectDraw和Direct3D设置对我来说不相关,但32位的directx.cpl确实禁用了32位DirectDraw和Direct3D,如32位DXDiag所验证的。

禁用64位DirectDraw和Direct3D的注册表键和过程在上面的解决方案部分详细说明。


%_Mode% 是用来做什么的?我没有那个变量。 - NONONONONO

0
你遇到问题的原因可能是你以另一个用户身份连接,或者作为远程桌面用户拥有不同的权限。我曾经在使用xrdp时遇到过这些问题。建议尝试使用TeamViewer或其他远程桌面解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接