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

3
我在JFrame中有一个AWT画布(我知道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循环会减慢我的程序?

游戏循环如下:

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

尝试一下这个AnimationTest - trashgod
@BDillan 我添加了一些我认为相关的代码,如果你需要看更多,我也可以添加。 - Mertcan Ekiz
@trashgod AnimationTest 程序似乎运行得很好,我认为影响我的程序的是双缓冲。 - Mertcan Ekiz
1
JPanel 默认情况下是双缓冲的。 - trashgod
我已经编辑了我的问题,你能否再看一下? - Mertcan Ekiz
显示剩余4条评论
1个回答

3

我在我的渲染方法中加入了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"); }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接