2017-07-31 119 views
1

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

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

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

的相应的代码是这个:

@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图像组成),这些都需要几毫秒。

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

+0

Graphics2D extemds图形。你在init()中保存Graphics2D。为什么不使用g2d而不是在drawToScreen()中创建另一个Graphics? – Dakoda

+0

如果您正在寻找能够高效呈现的2D游戏,那么您应该查看诸如libGDX(或其他扩展了Java OpenGL实现(LWJGL))的库。 OpenGL使用高效的图形管道以2D和3D渲染 –

回答

1

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

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

-Dsun.java2d.opengl=true

如果你只是渲染图像会被罚款继续使用BufferedImage。但是,如果您经常编辑图像,请考虑使用VolatileImage来代替。

这是关于我在加速Java2D游戏方面的知识。我会建议看看这个问题here。回答者似乎非常有知识,并且比我在同一主题上做得更深入。

+0

感谢您的回答。我现在通过JOGL使用OpenGL,这极大地加快了drawTime的速度。有时甚至比updateTime更快。 – Aschas