Java 2D游戏绘图性能

时间:2017-07-31 14:56:01

标签: java performance

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

  1. 将游戏的每个组成部分绘制到BufferedImage

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

  3. 相应的代码是:

    @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毫秒。 在绘制方法中,最慢的部分是绘制背景图像(1920x1080图像)并绘制水平(包含几个135x135图像),这两个都需要几毫秒。

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

1 个答案:

答案 0 :(得分:1)

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

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

-Dsun.java2d.opengl=true

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

这是关于加速Java2D游戏的知识。我建议看一下这个问题here。回答者似乎非常了解,并且比我对同一主题更深入。