我遇到了一个非常奇怪的问题,我试着寻找几天和几天的答案.我的游戏刚刚获得了一个新的粒子系统,但速度太慢而无法播放.不幸的是,BufferedImage转换非常慢.爆炸效果包括从.png文件加载的大约200个白色精灵,随机旋转,缩放和着色,以随机速度移动.
我试图通过三重/双重缓冲使性能更好,并遇到了一些问题.
我的第一次尝试是使用JPanel进行游戏.我在JFrame的类(Main)中设置缓冲区,然后在Game(扩展JPanel)类中完成绘图,但没有Graphics g = bufferstrategy.getDrawGraphics();. 然后,在绘图方法结束时,我显示缓冲区IF没有丢失.缓冲区总是"丢失",因为我没有使用它的Graphics对象进行绘图.但!游戏运行得和地狱一样快!在实际使用中没有缓冲!但是怎么样?
此尝试最终没有出现图形错误,并且具有巨大的性能提升 - 但仅限于nVidia/AMD显卡.英特尔GPU无法处理这个问题,屏幕闪烁白光.
所以,我最终设置并正确使用BufferStrategy.游戏类现在扩展画布,而不是JPanel中,作为正从一个JFrame的图形,并用它来画上一个JPanel在偏移结束了,因为它是在标题栏下绘制.仍然很快,修复60 FPS.
现在,当我在JFrame(Main类)中创建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 …Run Code Online (Sandbox Code Playgroud)