在Ubuntu 14.04闪烁的Java GUI(Flickering Java GUI in Ub

2019-10-21 20:32发布

我偶然发现了一个问题,我并不能解决我也能理解。 我正在写使用Java 1.8.0_31用一个简单的2D游戏java.awt.Canvas在Ubuntu 14.04。 问题是,我得到这个不堪闪烁(一个问题,我从来没有在Windows上),以确保我的代码是不是我写了一个小的测试程序与移动圆这个问题...

测试循环:

public void run() {

    long startTime = System.currentTimeMillis();
    long tick = 1000;
    int fps = 0;
    int upd = 0;

    double nanoScale = 1000000000.0 / 60;
    double delta = 0;

    long lastTime = System.nanoTime();
    while (running) {

        long now = System.nanoTime();
        delta += (System.nanoTime() - lastTime) / nanoScale;
        lastTime = now;

        while (delta > 1) {
            update();
            upd++;
            delta--;
        }
        render();
        fps++;

        if (System.currentTimeMillis() - startTime > tick) {
            window.setTitle(title + " || Fps: " + fps + " | Upd: " + upd);
            fps = 0;
            upd = 0;
            tick += 1000;
        }

        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}

这给了我60了185-190 fps的速率仅受限制一个很好的和稳定的更新率Thread.sleep(5)调用。

但是它看起来/感觉像FPS是令人难以置信的低(如同大多数帧掉下来),你就开始大呼小叫使用多个缓冲区现在前...

渲染方法:

public void render() {
    BufferStrategy bs = getBufferStrategy();
    if (bs == null) {
        createBufferStrategy(3);
        return;
    }

    Graphics2D g2d = (Graphics2D) bs.getDrawGraphics().create();
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setColor(Color.black);
    g2d.fillRect(0, 0, getWidth(), getHeight());
    g2d.setColor(Color.red);
    g2d.fillOval(x, y, 10, 10);
    g2d.dispose();

    bs.show();
}

奇怪的是使antialising暗示大大减少了闪烁,但不删除它。

我不能看到问题和抗锯齿之间的关系,开导我,如果有一个连接(我总是有Windows上的干净,光滑的结果,无论抗锯齿)。

所以我想的问题是:

什么可能导致问题的描述以及该用什么不能做到?

以防万一,这有助于我的显卡是gtx770和我使用的是NVIDIA二进制驱动-版本340.76 NVIDIA的-340(开源)

文章来源: Flickering Java GUI in Ubuntu 14.04