我在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();
}
答案 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"); }