Java 2D游戏绘图性能

3
我用Java创建了一个2D游戏,尝试让它在分辨率为1920x1080像素的情况下达到60帧每秒。我的游戏逻辑在不到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 扩展了 Graphics。你在 init() 中保存了 Graphics2D。为什么不使用 g2d 而不是在 drawToScreen() 中创建另一个 Graphics? - Dakoda
如果你想要构建一个高效渲染的2D游戏,你应该考虑使用像libGDX这样的库(或者其他扩展java OpenGL实现(LWJGL)的库)。OpenGL使用高效的图形管道来进行2D和3D渲染。 - Kylon Tyner
1个回答

2
Java的核心库并不适用于高效的图形渲染,而是用于用户界面。JavaFX支持硬件加速。如果您需要对图形进行微调,请参阅LWJGLLibGDX。LibGDX具有更高级别的抽象,而LWJGL直接绑定到OpenGL、OpenGLES和Vulkan API。
如果您不想使用这些库,Java可以启用硬件加速。据我所知,默认情况下未启用。您需要向JVM添加以下参数:

-Dsun.java2d.opengl=true

如果您只是渲染图像,继续使用BufferedImage是可以的。然而,如果您经常编辑图像,请考虑使用VolatileImage
这是我对加速Java2D游戏知道的大部分内容。我建议您查看这个问题here。答案者似乎非常有经验,并且在相同的主题上比我更深入地讨论了该问题。

谢谢您的回复。我现在正在使用JOGL通过OpenGL来绘制,这大大加快了绘制时间。有时候甚至比更新时间还要快。 - Aschas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接