2017-07-31 115 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