【问题标题】:Swing/AWT Double Buffering very slow on LinuxLinux 上的 Swing/AWT 双缓冲非常慢
【发布时间】:2014-05-10 05:47:12
【问题描述】:

我在 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 循环会减慢我的程序速度?

游戏循环如下所示:

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

【问题讨论】:

  • 显卡与 Java Swing Buffer Rates 无关。它的代码(很高兴看到)
  • 试试这个AnimationTest
  • @BDillan 我添加了一些我认为相关的代码,如果您需要查看更多内容,我也会添加
  • @trashgod AnimationTest 似乎运行得很好,我认为是双缓冲影响了我的程序
  • JPanel 默认是双缓冲的。

标签: java linux swing graphics awt


【解决方案1】:

我将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"); }

【讨论】:

    猜你喜欢
    • 2012-03-22
    • 2011-02-20
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2023-03-18
    • 2010-10-24
    相关资源
    最近更新 更多