Java Graphics2D仅在使用nvidia-*驱动程序(Ubuntu)时闪烁
当使用java Graphics2D绘制屏幕时,我在JFrame中随机得到一个全黑的窗口。当我尝试移动正在绘制的图像时,这种情况会更频繁。我使用了一个JPanel和重写的PaintComponent,并切换到一个带有缓冲策略的画布。在任何一种情况下我都会闪烁。缓冲策略设置为2。我每40毫秒用一个摆动计时器画图,我试着调节它,它没有什么区别,即使设置为非常高的延迟,比如4秒。只有在Ubuntu 20.04和GTX 1050 ti上使用任何专有的nvidia驱动程序时,才会发生这种情况。我尝试清除并重新安装驱动程序,我尝试了其他驱动程序下的所有可用驱动程序,并从nvidia的网站安装。如果我使用APUs嵌入式图形,则不会出现此问题,在使用嵌入式radeon图形的笔记本电脑上进行测试时也不会出现此问题。以下是我的绘画方式:Java Graphics2D仅在使用nvidia-*驱动程序(Ubuntu)时闪烁,java,Java,当使用java Graphics2D绘制屏幕时,我在JFrame中随机得到一个全黑的窗口。当我尝试移动正在绘制的图像时,这种情况会更频繁。我使用了一个JPanel和重写的PaintComponent,并切换到一个带有缓冲策略的画布。在任何一种情况下我都会闪烁。缓冲策略设置为2。我每40毫秒用一个摆动计时器画图,我试着调节它,它没有什么区别,即使设置为非常高的延迟,比如4秒。只有在Ubuntu 20.04和GTX 1050 ti上使用任何专有的nvidia驱动程序时,才会发生这种情况。我尝试清除并
bf = getBufferStrategy();
Graphics2D g = (Graphics2D) bf.getDrawGraphics();
do {
try{
g.clearRect(0,0,getWidth(),getHeight());
//Drawing Loading
if(c.getLoading()){
drawLoading(g);
}
//Draw Login
if(c.getShowLogin()){
drawLogin(g);
}
if(c.drawGame()){
drawGame(g);
}
} finally {
g.dispose();
}
bf.show();
} while (bf.contentsLost());
我尝试在nvidia设置应用程序下更改功率级别和openGL性能,但没有成功
[编辑]顺便说一句,java:openjdk 11.0.8 2020-07-14在两台机器上都进行了测试。我觉得很傻,我查看了JavaDoc中的BufferStrategy,看看是否遗漏了一些明显的东西。其中包括一个示例,其中有一个内部do while循环,用于检查缓冲区内容是否已恢复,因此我将渲染循环更改为:
bf = getBufferStrategy();
do {
do {
Graphics2D g = (Graphics2D) bf.getDrawGraphics();
g.clearRect(0,0,getWidth(),getHeight());
//Drawing Loading
if(c.getLoading()){
drawLoading(g);
}
//Draw Login
if(c.getShowLogin()){
drawLogin(g);
}
if(c.drawGame()){
drawGame(g);
}
g.dispose();
} while (bf.contentsRestored());
bf.show();
} while (bf.contentsLost());
到目前为止没有闪烁。
Java文档:
[编辑]我很快就和你谈过了。。我仍然接收到间歇性闪烁。如果有帮助,以下是我的虚拟机选项:-Dsun.java2d.opengl=True-Xms256m-Xmx2048m
如果没有opengl=True,它的持续闪烁非常糟糕
在关闭Chrome并将游戏服务器端与intellij idea分离后,我看不到闪烁。我把它记为我的环境,不可重复(客户端占用了30%的cpu,最大平均15%),希望如此。我建议这是一个驱动程序问题