Java Graphics2D仅在使用nvidia-*驱动程序(Ubuntu)时闪烁

Java Graphics2D仅在使用nvidia-*驱动程序(Ubuntu)时闪烁,java,Java,当使用java Graphics2D绘制屏幕时,我在JFrame中随机得到一个全黑的窗口。当我尝试移动正在绘制的图像时,这种情况会更频繁。我使用了一个JPanel和重写的PaintComponent,并切换到一个带有缓冲策略的画布。在任何一种情况下我都会闪烁。缓冲策略设置为2。我每40毫秒用一个摆动计时器画图,我试着调节它,它没有什么区别,即使设置为非常高的延迟,比如4秒。只有在Ubuntu 20.04和GTX 1050 ti上使用任何专有的nvidia驱动程序时,才会发生这种情况。我尝试清除并

当使用java Graphics2D绘制屏幕时,我在JFrame中随机得到一个全黑的窗口。当我尝试移动正在绘制的图像时,这种情况会更频繁。我使用了一个JPanel和重写的PaintComponent,并切换到一个带有缓冲策略的画布。在任何一种情况下我都会闪烁。缓冲策略设置为2。我每40毫秒用一个摆动计时器画图,我试着调节它,它没有什么区别,即使设置为非常高的延迟,比如4秒。只有在Ubuntu 20.04和GTX 1050 ti上使用任何专有的nvidia驱动程序时,才会发生这种情况。我尝试清除并重新安装驱动程序,我尝试了其他驱动程序下的所有可用驱动程序,并从nvidia的网站安装。如果我使用APUs嵌入式图形,则不会出现此问题,在使用嵌入式radeon图形的笔记本电脑上进行测试时也不会出现此问题。以下是我的绘画方式:

 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%),希望如此。

我建议这是一个驱动程序问题