Swing / AWT双缓冲在Linux上非常慢

时间:2014-03-31 01:24:23

标签: java linux swing graphics awt

我在JFrame中有一个AWT Canvas(我知道Swing和AWT不应该同时使用,但它在Windows上运行良好,所以我不认为问题是由此导致的)并且使用了来自Canvas的BufferStrategy在屏幕上绘制。它在Windows上运行得非常流畅,但是当我试图在Ubuntu 12.04上运行它时,它变得难以忍受。不只是渲染,而且JFrame也没有响应。当我注释掉双缓冲和渲染部分时,它再次平滑。我有一个不再支持的ATI显卡,所以我使用的是开源视频驱动程序,但是当我运行另一个使用OpenGL的程序时,它并不像Swing / AWT那样慢。为什么会发生这种情况?

主渲染:

...

private void render()
{
    bs = gamePanel.getBufferStrategy();

    Graphics g = bs.getDrawGraphics();

    currentState.render(g);

    g.dispose();
    bs.show();
}

...

除了填充屏幕的黑色矩形外,我不会在currentstate.render()方法中绘制任何内容。

编辑:好的,所以我追查了真正的问题,这是我的游戏循环。我在新线程中使用while循环来更新和渲染(上面提供的渲染代码)。如果我使用Canvas的paint()方法,它可以顺利运行,但之后我无法控制帧速率。为什么while循环会减慢我的程序?

Game Loop看起来像这样:

    while(running)
    {
        update();
        render();
    }

1 个答案:

答案 0 :(得分:0)

我将 Toolkit.getDefaultToolkit().sync(); 放在我的渲染方法中,似乎可以修复它。但是你应该只在它是 Linux
我使用下面的代码来做到这一点

public static String getOsName() {
    String OS = null;
    if(OS == null) { OS = System.getProperty("os.name"); }
    return OS;
}

public static boolean isUnix() { return getOsName().startsWith("Linux"); }