【问题标题】:Java 2D Game drawing performanceJava 2D 游戏绘图性能
【发布时间】:2018-01-07 05:17:52
【问题描述】:

我在 Java 中创建了一个 2D 游戏,并试图将其设置为 60 fps,分辨率为 1920x1080 像素。我的游戏逻辑在不到 1 毫秒的时间内表现良好。但绘图需要超过 10 毫秒。这在我相当强大的台式机(intel i5-4670K @ 3.40 Ghz)上可能就足够了,但在我的笔记本电脑(intel i5-6300HQ @2.30 Ghz)上,游戏已经慢了很多。绘图分为两个主要步骤:

  1. 将游戏的每个组件绘制到 BufferedImage 上

  2. 在我的扩展 JPanel 类中绘制 BufferedImage

对应的代码是这样的:

@Override
public void run() {

    init();

    long startTime;
    long elapsedTime;
    long waitTime;

    while(running) {

        startTime = System.nanoTime();

        update();
        long updateTime = (System.nanoTime() - startTime) / 1000000;
        draw();
        long drawTime = (System.nanoTime() - startTime) / 1000000;
        drawToScreen();
        long drawscreenTime = (System.nanoTime() - startTime) / 1000000;

        elapsedTime = System.nanoTime() - startTime;
        waitTime = targetTime - elapsedTime / 1000000;
        if(waitTime < 0) {
            waitTime = 0;
        }

        try {
            Thread.sleep(waitTime);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

public void init() {

    GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice device = env.getDefaultScreenDevice();
    GraphicsConfiguration config = device.getDefaultConfiguration();
    image = config.createCompatibleImage(1920, 1080, Transparency.TRANSLUCENT);

    g2d = (Graphics2D) image.getGraphics();
    running = true;
    gsm = new GameStateManager(this);
}

public void update() {
    gsm.update();
    Keys.update();
}

public void draw() {
    gsm.draw(g2d);
}

public void drawToScreen() {
    Graphics g = getGraphics();
    g.drawImage(image, 0, startDrawY, scaledWidth, scaledHeight, null);
    g.dispose();
}

draw 和 drawToScreen 方法最多需要 5 毫秒。 在 draw 方法中,最慢的部分是绘制背景图像(1920x1080 图像)和绘制关卡(由几个 135x135 图像组成),两者都需要几毫秒。

现在我有两个问题:这样的大图像的绘制速度是否正常?如果不是,我可能在这里做错了什么,或者如何提高绘图性能?

【问题讨论】:

  • Graphics2D 扩展图形。您将 Graphics2D 保存在 init() 中。为什么不使用 g2d 而不是在 drawToScreen() 中创建另一个图形?
  • 如果您希望构建一个高效渲染的 2D 游戏,您应该研究 libGDX 等库(或任何其他扩展 java OpenGL 实现 (LWJGL) 的库)。 OpenGL 使用高效的图形管道以 2D 和 3D 进行渲染

标签: java performance


【解决方案1】:

Java 的核心库并非用于高效的图形渲染,而是用于用户界面。 JavaFX 支持硬件加速。如果您需要对图形进行微调,请参阅LWJGLLibGDX。 LibGDX 具有更高级别的抽象,而 LWJGL 直接绑定到 OpenGL、OpenGLES 和 Vulkan API。

如果您不想使用这些库,Java 可以启用硬件加速。据我所知,默认情况下不启用它。您需要将以下参数添加到 JVM:

-Dsun.java2d.opengl=true

如果您只是渲染图像,则可以继续使用BufferedImage。但是,如果您经常编辑图像,请考虑改用VolatileImage

这是关于我对加速 Java2D 游戏的了解程度。我建议查看这个问题here。回答者似乎知识渊博,并且比我在同一主题上更深入。

【讨论】:

  • 感谢您的回答。我现在通过 JOGL 使用 OpenGL,这极大地加快了绘制时间。它有时甚至比 updateTime 还要快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 2014-01-21
  • 1970-01-01
  • 2020-07-14
  • 2016-05-23
  • 1970-01-01
  • 2016-05-08
相关资源
最近更新 更多