Sim*_*más 26 java performance buffer intel
我遇到了一个非常奇怪的问题,我试着寻找几天和几天的答案.我的游戏刚刚获得了一个新的粒子系统,但速度太慢而无法播放.不幸的是,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 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-
}
Run Code Online (Sandbox Code Playgroud)
当然,我会在游戏启动后立即调用setBuffers().
我希望你能帮助我,这个问题非常重要,因为在我看来使用VolatileImage不会提高性能,因为需要使用BufferedImage进行图像处理.我敢打赌,我错过了一些微不足道的事情,或者做错了事.
这是我的电脑规格,只是为了表明它不是硬件问题:英特尔酷睿i7-3770k @ 4.3GHz,nVidia GTX 460,12 GB RAM
"快速"计算机:Intel Core 2 Duo @ 2.7 GHz,集成Intel Graphics,2 GB RAM
谢谢你的帮助和时间!:)
编辑 可以VolatileImage帮助吗?如果我知道的话,必须使用BufferedImages完成图像处理,但绘制它们是缓慢的.
与缓存相比检查图片的大小,并尝试诊断缓存未命中的数量。阅读面向数据的设计,它通常是其中的一部分。
另一种方法是将爆炸的方式更改为不加载 200 个精灵并将它们展开(是重复使用它们,还是每次爆炸时都加载它们?)。制作动画爆炸需要较少的能量,尽管它可能不会那么壮观,然后您需要做一些动画。
Java 也不是制作游戏的最佳语言。您的工作级别非常高,而 JVM 会稍微减慢速度。我的朋友在制作小游戏时也遇到过类似的问题,很难制作出不卡顿的游戏。
| 归档时间: |
|
| 查看次数: |
2343 次 |
| 最近记录: |