【问题标题】:Java rendering over remote desktop远程桌面上的 Java 渲染
【发布时间】:2018-01-06 20:30:01
【问题描述】:

我正在尝试通过windows7下的远程桌面运行我在RHEL7服务器中制作的java程序。

服务器中的所有 java 程序都无法通过远程桌面呈现。如果我在服务器位置访问服务器本身,它们看起来还不错。

我在其他线程中看到更改 nvidia 配色方案等会有所帮助,但是服务器使用的是默认图形。

【问题讨论】:

    标签: java remote-desktop


    【解决方案1】:

    我想通了:

    • 启动远程连接时,打开连接选项。
    • 转到屏幕
    • 去颜色
    • 选择 16 位颜色。

    完成。

    【讨论】:

      【解决方案2】:

      当通过 RDP 连接到 Windows 7 机器时,这有效:

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

      接受的答案对我不起作用,但指向了这个方向 (我会发表评论,但目前我没有足够的声誉)。

      【讨论】:

        【解决方案3】:

        此答案扩展了 TeamViewer 线程中有关“Some applications does not show content (white window) Windows 10 host”的详细解决方案。

        请参阅下面的“解决方案”。

         

        摘要

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

        基于有和没有连接显示器的应用程序的行为,对graphics accelerators的表面理解,以及我在下面引用的论坛帖子中的经验,我认为无内容窗口的原因是应用程序的结果当加速器因显示器断开连接而禁用时,依赖于 DirectDraw 或 Direct3D 子系统(与 3D 加速硬件接口)。

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

        也许这是 3D 图形处理器的省电功能,它在未检测到屏幕时激活,或者这可能与帧缓冲区不知道支持的输出分辨率有关,因此禁用了 Windows shell 对 GPU 的访问,这会导致 Windows 恢复为纯软件渲染;或其他原因。

        不管是什么原因,我假设在禁用监视器时专用图形硬件无法用于 3D 处理,并且所有遇到问题的软件的共同点是 Java,我质疑 JVM 是否依赖 D3D 进行渲染,即使 Windows 仅提供纯软件渲染。

           

        解决方案

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

        使用 DXDiag,我检查了 Display DirectX Features 的状态:

        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 检查了 Display DirectX Features 的新状态:

        DirectDraw 加速:禁用

        Direct3D 加速:禁用

        AGP 纹理加速:不可用

        当监视器分离时,Java 程序窗口现在可以通过 VNC 查看器正确呈现内容。

        我没有尝试在 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

        Disabled?Display Detection?,防止检测到断线,避免禁用HW加速

        [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000]
        "Display_Detection_DEF"=dword:00000001
        

        为 ATI 卡创建/NULL DMMEnableDDCPolling - 参考:NetMage 发布

        [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000]
        "DMMEnableDDCPolling"=dword:00000000
        

        系统重启后没有任何影响,尽管笔记本电脑的盖子在重启期间是关闭的。尽管即使它确实有效,但这也可能不是一个合适的解决方案。

        一个更合适的解决方案是如果 3D 硬件加速可以强制“始终开启”,而不管监视器检测。

         

        系统范围(Java 控制面板)禁用 Java 应用程序的 D3D 加速

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

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

         

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

        参考:https://stackoverflow.com/a/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 加速

        参考:How to disable Direct3D Acceleration on Windows 7?

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

        我运行的不是 32 位版本的 Windows 7

         

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

        参考: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 位 DXDiag 验证的 32 位 DirectDraw 和 Direct3D。

        上面的解决方案部分详细介绍了用于禁用 64 位 DirectDraw 和 Direct3D 的注册表项和过程。

        【讨论】:

        • %_Mode% 是干什么用的?我没有那个变量。
        【解决方案4】:

        从远程会话中注销(不仅仅是断开连接)为我改变了它。也许这个答案对一些在这篇文章中结束的人有所帮助,因为他们在远程连接上玩弄了一下之后,在 Java 应用程序上有一个有趣的超大边框。

        我通过 windows 10 使用 mac parallels 软件进行远程连接。然后我对 parallels 进行了配置更改。然后我在我的 mac 上设置了一个 vpn 和远程连接并遇到了问题。我在远程站点注销并重新登录,它变得“正常”。

        【讨论】:

          【解决方案5】:

          出现问题的原因可能是您以其他用户的身份连接和/或作为远程桌面用户拥有不同的权限。我在 xrdp 上遇到了这些问题。 尝试 TeamViewer 或其他远程桌面解决方案。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-21
            • 1970-01-01
            • 2018-06-18
            • 2012-07-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多