我遇到了一个非常奇怪的问题,我试图寻找答案已经好几天了。我的游戏刚刚添加了一个新的粒子系统,但运行起来太慢了,导致无法玩耍。不幸的是,BufferedImage转换非常缓慢。爆炸效果由约200个从.png文件加载的白色精灵组成,这些精灵被随机旋转、缩放和着色,并以随机速度移动。
我尝试通过三重/双重缓冲来提高性能,并遇到了一些问题。
我的第一次尝试是使用绘制游戏的JPanel。我在JFrame的类(Main)中设置了缓冲区,然后在Game(扩展JPanel)类中进行绘画,但是没有使用Graphics g = bufferstrategy.getDrawGraphics();。然后,在绘画方法的末尾,如果缓冲区没有丢失,我就显示它。缓冲区总是“丢失”的,因为我没有用它的Graphics对象进行绘画。但是!游戏运行得飞快!实际上没有使用缓冲区!但是,为什么呢?
这个尝试最终没有出现图形错误,并且大大提高了性能-但只有在nVidia/AMD显卡上。英特尔GPU无法处理这个问题,屏幕会闪白色。
因此,我最终正确地设置和使用了BufferStrategy。现在Game类扩展Canvas而不是JPanel,因为从JFrame获取Graphics并在JPanel上绘制会导致偏移,因为它在标题栏下面绘制。仍然很快,固定60FPS。
现在,当我在JFrame(Main类)中创建BufferStrategy时,根本没有图片显示。我通过在Game类(Canvas)中设置BufferStrategy来纠正了这一点。现在图片是正确的,但游戏本身像蜗牛一样缓慢。一个爆炸会使FPS降至约10帧,但只有在nVidia / AMD上。具有讽刺意味的是,即使是旧的英特尔GPU也能以60FPS运行,我设法在5-6年前的集成英特尔GPU上实现了10000个粒子在运动中以60FPS的速度运行。我的显卡在发生爆炸时负载达到100%。
以下是我的主要代码(整个代码不清楚且很长):
public class Game extends Canvas {
-snip-
public void tick() {
BufferStrategy bf = getBufferStrategy();
Graphics g = null;
try {
g = bf.getDrawGraphics();
paint(g);
} finally {
g.dispose();
}
if (!bf.contentsLost()) {
bf.show();
} else {
System.err.println("Buffer lost!");
}
Toolkit.getDefaultToolkit().sync();
}
public void setBuffers() {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
if (gc.getBufferCapabilities().isMultiBufferAvailable()) {
createBufferStrategy(3);
System.out.println("Triple buffering active");
} else {
createBufferStrategy(2);
System.err.println("Triple buffering not supported by the GPU");
System.out.println("Double buffering active");
}
System.out.println("FullScreen required: " + getBufferStrategy().getCapabilities().isFullScreenRequired());
System.out.println("Page flipping: " + getBufferStrategy().getCapabilities().isPageFlipping());
}
public void paint(Graphics g) {
super.paint(g);
//set up RenderingHints, draw stuff
}
-snip snip-
}
当然,在游戏启动时我会立刻调用 setBuffers()。希望你能帮帮我,这个问题非常重要,因为在我看来使用 VolatileImage 不会提高性能,因为图像操作需要使用 BufferedImage。我想我可能错过了一些微不足道的东西,或者做错了什么。
这是我的电脑配置,只是为了显示这不是一个硬件问题: Intel Core i7-3770k @ 4.3GHz, nVidia GTX 460, 12 GB内存
"快速"计算机: Intel Core 2 Duo @ 2.7 GHz, 集成的英特尔图形, 2 GB内存
谢谢你的帮助和时间! :)
编辑 VolatileImage 有用吗? 如果我没记错的话,必须使用 BufferedImage 进行图像操作,但绘制它们会很慢。