当前位置: 首页 > 知识库问答 >
问题:

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

葛季萌
2023-03-14

我在JFrame中有一个AWT画布(我知道Swing和AWT不应该同时使用,但它在Windows上工作得很好,所以我不认为问题是由这个引起的),并使用画布中的BufferStrategy在屏幕上绘制。它在Windows上运行非常流畅,但当我试图在Ubuntu12.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循环来更新和呈现(上面提供的呈现代码)。如果我使用画布的paint()方法,它运行平稳,但我无法控制帧率。为什么while循环会减慢我的程序?

游戏循环如下所示:

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

共有1个答案

单于正业
2023-03-14

我将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"); }
 类似资料:
  • 问题内容: awt是否可以进行双缓冲(在Java中)?目前,我知道awt不应该与swing一起使用,所以我不能使用BufferStrategy之类的东西(我已经用awt编写了一些我不想在swing中重写的代码)。 如果使用awt可以进行双缓冲,我是否必须手动写入缓冲区?与swing不同,awt似乎没有相同的内置双缓冲功能。 如果必须手动编写代码,是否有一个不错的教程可以看?还是对于新手程序员来说,

  • 问题内容: 我正在研究一个项目,并且在使用Java的双重缓冲方面已经读了尽可能多的内容。我想做的是向我的JFrame添加一个组件或面板或包含要绘制到其上的双缓冲表面的东西。如果可能,我想使用硬件加速,否则请使用常规软件渲染器。到目前为止,我的代码如下所示: 我创建了一个抽象的游戏类和一个调用Update和Draw的游戏循环。现在,如果您看到我的评论,那就是我主要关注的领域。有没有一种方法可以获取图

  • 问题内容: 在从事2D游戏时,我读了很多有关Double Buffering的文章。我遇到了许多不同的实施策略,但不确定如何将Double Buffering放入我创建游戏窗口的方式中。例如,我遇到的一篇文章(http://content.gpwiki.org/index.php/Java:Tutorials:Double_Buffering)建议使用一种单独的绘制方法;但是,我怀疑如果您正在绘制

  • 问题内容: 我正在寻找在Linux上执行异步文件I / O的最有效方法。 POSIX glibc实现使用用户空间中的线程。 本地aio内核api仅适用于无缓冲操作,存在用于内核以添加对缓冲操作的支持的补丁程序,但是这些补丁程序已有3年的历史了,似乎没有人关心将它们集成到主线中。 我发现了许多其他允许异步I / O的想法,概念和补丁,尽管其中大多数都在3年以上的文章中。在当今的内核中,这到底是什么呢

  • 问题内容: 我碰到一行,命令的输出已完全缓冲。这是什么意思? 问题答案: 在线C11标准 7.21.3 / 3: 当流没有 缓冲时 ,字符应尽快从源或目标出现。否则,字符可能会作为块被累积并传输到主机环境或从主机环境传输。当流被 完全缓冲时 ,打算在填充缓冲区时将字符作为块与主机环境进行传输。当流被 行缓冲时 ,当遇到换行符时,字符打算作为块与主机环境进行传输。此外,当填充缓冲区,在无缓冲流上请求

  • 问题内容: 我的测试应用程序是 我想在每个输入字符后看到字符代码。但实际上* s仅在控制台中的’\ n’之后打印。因此,似乎缓冲了stdin(文件的desc 0)。但是读取功能没有缓冲区,不是吗?我哪里错了。 UPD:我使用linux。 所以解决方案是 问题答案: 不幸的是,标准ANSI C无法实现您要查找的行为,并且UNIX终端I / O的默认模式是面向行的,这意味着您将始终需要输入的字符来检索