我遇到了一个非常奇怪的问题,我试图寻找答案几天和几天。我的游戏刚刚有了一个新的粒子系统,但速度太慢而无法播放。不幸的是,BufferedImage 转换非常缓慢。爆炸效果由大约 200 个从 .png 文件加载的白色精灵组成,它们随机旋转、缩放和着色,以随机速度移动。
我试图通过三重/双缓冲来提高性能,但遇到了一些问题。
我的第一次尝试是使用 JPanel 绘制游戏。我在 JFrame 的类 (Main) 中设置了缓冲区,然后在 Game (extends JPanel) 类中完成了绘图,但是没有 Graphics g = bufferstrategy.getDrawGraphics();。然后,在绘图方法结束时,如果缓冲区没有丢失,我会显示它。缓冲区总是“丢失”,因为我没有使用它的 Graphics 对象进行绘图。但!游戏跑得飞快!实际使用中无缓冲!但是怎么做?
这次尝试最终没有出现图形错误,并且性能得到了巨大的提升——但仅限于 nVidia / AMD 卡。英特尔 GPU 无法处理此问题,屏幕呈白色闪烁。
所以,我最终正确设置和使用了 BufferStrategy。Game 类现在扩展了 Canvas,而不是 JPanel,因为从 JFrame 中获取 Graphics,并使用它在 JPanel 上绘制以偏移结束,因为它在标题栏下绘制。仍然很快,修复 60 FPS。
现在,当我在 JFrame(主类)中创建 BufferStrategy 时,根本没有图片。我通过在 Game 类(Canvas)中设置 BufferStrategy 来纠正这个问题。现在画面是正确的,但是游戏本身就像蜗牛一样慢。一次爆炸将 FPS 降至约 10,但仅限于 nVidia / AMD。讽刺。即使是旧的英特尔 GPU 也能以 60 FPS 的速度处理它,我设法在 5-6 年的集成英特尔 GPU 上以 60 FPS 的速度让 10000 个粒子运动。发生爆炸时,我的卡负载高达 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 ram
“快速”计算机:Intel Core 2 Duo @ 2.7 GHz,集成 Intel 显卡,2 GB 内存
感谢您的帮助和时间!:)
编辑 VolatileImage 有帮助吗?如果我没看错的话,必须使用 BufferedImages 来处理图像,但绘制它们的速度很慢。