作者:ftwinkle | 来源:互联网 | 2022-12-01 21:45
我在Kubuntu 18.04的Java 8 update 181中开发了一个应用程序.在我的开发PC中,我使用英特尔i3-6100和英特尔®高清显卡530.所有图形都是使用swing完成的,使用这种硬件配置,一切都可以正常工作.
在生产PC上,我使用英特尔(R)Celeron(R)CPU J1900,采用英特尔®高清显卡,适用于英特尔凌动®处理器Z3700系列.使用相同的操作系统和java版本运行相同的操作我发现我的图形在摇摆中完成了问题.
摇摆组件,如jLabels,jButton等,不更新.例如,框架A的标签B带有文本"旧文本",我用文本"新文本"更新标签B上的文本,然后我将setVisible(true)调用到框架A,框架变为可见文本"旧"文本".这不是每次都发生,有时它会更新,有时我不会.这仍然发生在我添加SwingUtilities与我的解决方案不同的事件中,如下所述.
在标签中,我的.gif动画运行不顺畅,或者它们冻结了.
交换活动帧(在第二个上显示为真,在第一个上为false)有一些延迟.
经过一段时间后,GUI应用程序冻结并在一段时间后继续工作,有时几分钟后,有时几秒钟后.
因此,在许多论坛上搜索后,我对我的应用程序进行了以下更改
开始使用SwingUtilities.invokeLater()或SwingUtilities.invokeAndWait()(我想在显示它之前更改某些内容,例如,如果服务的价格是80.00更新然后显示它)我到处更新我的GUI组件.
在组件的每次更新之后,我调用component.revalidate()和component.repaint()或repaint(50).
每次调用frame.setVisible(status)时,我都会等待来自windowListener的信号,即激活和打开帧,或者取消激活和关闭,具体取决于调用true或false作为状态.
在仍然遇到没有更新摆动组件的问题之后,我尝试将框架设置为可见而不是更新其所有组件.这在开始的一段时间内工作正常,但过了一段时间后我注意到有时组件不会更新.这是一个丑陋的解决方法,有时会起作用,因为当框架可见时,您可以看到内容在框架上发生变化.
我读到英特尔HD 3000系列上的图形硬件加速存在问题,所以在某些论坛上,我读到我应该使用VM选项-Dsun.java2d.d3d = false和-Dsun.java2d.opengl = True调用我的应用程序.这样,图形有点平滑,但在12到24小时之后的一段时间(不完美)之后,图形会冻结约5分钟,而不是更新任何东西.
在一些论坛上,我看到用户通过从java 8降级到java 7来解决了这个问题(这需要修改我的代码和我同事的其他代码,我估计至少2个月),在某些论坛上,我看到降级到java 8更新25有助于解决此问题.我尝试降级到java 8更新25并且图形和动画开始变得更顺畅,但是在一段时间(最后一次24小时)之后,应用程序开始冻结.
我检查我的操作系统有最新版本的英特尔高清显卡,并有OpenGL 3.0版Mesa 18.0.5.
另外,我看到了很多关于在Intel HD上用java 8运行的游戏Minecraft的问题.
我对java GUI没有太多经验,但我不明白它如何与一个Intel HD图形精细配合,而其他没有.写一次运行任何地方的java概念这次失败了.
//编辑2018-11-02最后我的mini pci-e到pci-e卡到达了我在aliexpress上订购的,但图形仍然出现故障.不知道下一步该尝试什么.我想所有的图形渲染都是由处理器完成的,而不是我的nvidia卡或intel hd图形.