【问题标题】:How can I speed up my Java game's FPS?如何加快 Java 游戏的 FPS?
【发布时间】:2017-02-09 07:17:03
【问题描述】:

我正在制作一个 Java 游戏,当我绘制图形时,游戏会滞后很多。 我目前绘制图形的方式是制作一个BufferedImage,从中获取Graphics2D,然后做一大堆:

g2d.drawImage(loadedImages.getImage(),x,y,null);

将所有图像打印到BufferedImage 后,我将BufferedImage 绘制到屏幕上。

我在BufferedImage 上画了很多图像。有没有更好的方法可以加快绘画时间? 我对显卡和显卡了解不多。我应该使用显卡吗?我应该直接在屏幕上绘画吗?我应该使用与drawImage() 完全不同的东西吗?

【问题讨论】:

  • 也许研究一下 OpenGL 是个好主意。您可以将它用于相同的目的(可能需要更多的努力),但它可以比Graphics2D 更好地加速。
  • 我喜欢直接使用 LWJGL(轻量级 Java 游戏库,一个 OpenGL 包装器)——必须编写一个薄包装器,但它非常适合 2D ;-) 还有其他现有的游戏库,包括 Slick2D . Java 确实支持一些 2D 加速,但我总觉得它命中注定。
  • 如需尽快获得更好的帮助,请发帖 SSCCE。在代码中生成“大量图像”。
  • 在双缓冲组件中使用“背景”图像的唯一真正优势是,如果其中有一个不改变或很少改变的复杂场景。

标签: java optimization frame-rate


【解决方案1】:

如果您要绘制合理数量的图像,性能应该会很好。

确保您不是每次在屏幕上绘制时都创建新的BufferedImages。例如,您可能有一个 Resources singleton,您可以在其中管理所有图像,以便您只加载和卸载每个图像一次。


如果你真的想要更高的性能,你会想要使用 OpenGL。请参阅LWJGLlibgdxJOGL。您可能还需要考虑 2D 图形库,例如 Slick

【讨论】:

  • LWJGL 和 LibGDX 有什么区别?
  • LWJGL 更适合桌面开发,而 libgdx 可以在 Android 和桌面上运行。
【解决方案2】:

我发现扩展 java.awt.Canvas 并使用它很有用

BufferStrategy bs;
void init() {
    createBufferStrategy(2);// or 3 for triple-buffering
    bs = getBufferStrategy();
}

然后实际的draw() 方法看起来像

void draw() {
    Graphics g = bs.getDrawGraphics();
    g.drawImage(image, x, y, w, h, null);
    // Draw more things here...
    // You can also make calls like `myObject.draw(g)` and whatever
    //    you draw onto `g` within those calls will show up.
    bs.show();
    g.dispose();
}

这是我用来画很多东西的。然后在每个myObject.draw(g) 调用中,有时会有多个其他类似的调用全部链接起来。大多数情况下,我的主要draw() 方法中有一个或两个for 循环,它只是说for(Entity e: entities) e.draw(g); 或类似的东西。然后整个绘图链从那里开始。

【讨论】:

    猜你喜欢
    • 2014-11-08
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多