我在 Kubuntu 18.04 中用 java 8 update 181 开发了一个应用程序。在我的开发 PC 中,我拥有配备英特尔® HD Graphics 530 的英特尔 i3-6100。所有图形均使用 swing 完成,并且通过此硬件配置,一切都按预期运行。
在生产 PC 上,我拥有 Intel(R) Celeron(R) CPU J1900,带有适用于 Intel Atom® 处理器 Z3700 系列的 Intel® HD 显卡。使用相同的操作系统和 java 版本运行相同的程序,我注意到我在 swing 中完成的图形存在问题。
- jLabels、jButton 等 Swing 组件未更新。例如,框架 A 的标签 B 带有文本“旧文本”,我用文本“新文本”更新标签 B 上的文本,然后我对框架 A 调用 setVisible(true),该框架变得可见,并带有文本“旧文本”文本”。这种情况不是每次都会发生,有时更新,有时不更新。当我将 SwingUtilities 添加到我的解决方案之外时,这种情况仍然会发生,如下所述。
- 在我的 .gif 动画运行不顺畅或冻结的标签中。
- 交换活动帧(在第二个帧上明显更改为 true,在第一个帧上更改为 false)有一些延迟。
- 一段时间后,GUI应用程序冻结并在一段时间后继续工作,有时是几分钟后,有时是几秒钟后。
因此,在搜索了许多论坛后,我对我的应用程序做了以下更改
- 开始使用 SwingUtilities.invokeLater() 或 SwingUtilities.invokeAndWait() (我想在显示之前更改某些内容,例如,如果服务的价格是 80.00 更新,然后显示它),我在任何地方更新我的 GUI 组件。
- 每次更新组件后,我都会调用 component.revalidate() 和 component.repaint() 或 repaint(50)。
- 每次我调用frame.setVisible(status)时,我都会等待来自windowListener的信号,该信号表明框架被激活和打开,或者停用和关闭,具体取决于以true或false作为状态的调用。
- 在仍然遇到摆动组件未更新的问题之后,我尝试将框架设置为可见,然后更新其所有组件。一开始,这在一段时间内工作得很好,但一段时间后,我注意到有时组件又没有更新。这是一个丑陋的解决方法,但有时会起作用,因为当框架可见时,您可以看到框架上的内容正在变化。
- 我读到 Intel HD 3000 系列上的图形硬件加速存在问题,因此在一些论坛上,我读到我应该使用 VM 选项 -Dsun.java2d.d3d=false 和 -Dsun.java2d.opengl=True 调用我的应用程序。这样,图形会更平滑一些,但在 12 到 24 小时之间的一段时间(并不完美)之后,图形会冻结大约 5 分钟,不会更新任何内容。
- 在一些论坛上,我看到用户通过从 java 8 降级到 java 7 来解决这个问题(这需要修改我的代码和同事的其他代码,我估计至少需要 2 个月),在一些论坛上,我看到降级到 java 8更新 25 有助于解决此问题。我尝试降级到 java 8 update 25,图形和动画开始变得更加流畅,但在一段时间后(上次是 24 小时),应用程序再次开始冻结。
- 我检查了我的操作系统是否具有最新版本的 Intel HD 显卡以及 OpenGL 版本 3.0 Mesa 18.0.5。
另外,我在 Intel HD 上使用 Java 8 运行《我的世界》游戏时发现了很多问题。
我对 java GUI 没有太多经验,但我不明白它如何与一个英特尔高清显卡配合使用,而与其他显卡配合使用则不行。这次写一次就可以在任何地方运行java的概念让我失败了。
//编辑2018-11-02
最后,我在速卖通上订购的迷你 PCI-E 转 PCI-E 卡到货了,但图形仍然出现故障。不知道接下来要尝试什么。我猜想所有的图形渲染都是由处理器完成的,而不是我的 nvidia 卡或 intel 高清显卡。
有一个已知的错误:https://bugs.openjdk.java.net/browse/JDK-8067328 https://bugs.openjdk.java.net/browse/JDK-8067328。 Oracle建议禁用D3D(他们在8_40中默认禁用它)。
这篇文章最后描述了同样的问题和解决方法:https://yakovfain.com/2014/06/27/swing-rendering-seems-to-be-broken-in-java-8/ https://yakovfain.com/2014/06/27/swing-rendering-seems-to-be-broken-in-java-8/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)