2017-07-31 25 views
1

私はJavaで2Dゲームを作成し、1920x1080ピクセルの解像度で60fpsにしようとしています。私のゲームロジックは1ミリ秒未満で正常に動作しています。しかし、描画には10ミリ秒以上かかる。これは私のかなり強いデスクトップ(intel i5-4670K @ 3.40 Ghz)で十分かもしれませんが、私のラップトップ(intel i5-6300HQ @ 2.30 Ghz)ではゲームはすでにかなり減速しています。図面は、2つの主要な段階に分かれています。Java 2Dゲームの描画パフォーマンス

  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とscreenToScreenメソッドの両方が使用されます。 ~5ミリ秒。 描画方法の中で最も遅い部分は、背景画像(1920x1080画像)を描画しており、数ミリ秒かかるレベル(複数の135x135画像からなる)を描画しています。

今私は2つの質問があります:このような大きな画像の場合、この描画速度は普通ですか?ここで間違っているのではないか、または描画パフォーマンスを改善するにはどうすればよいですか?

+0

Graphics2D extemds Graphics。 Graphics2Dをinit()に保存しています。なぜdrawToScreen()に別のGraphicsを作成するのではなく、g2dを使うのですか? – Dakoda

+0

効率的にレンダリングする2Dゲームを作成するには、libGDX(またはJava OpenGL実装(LWJGL)を拡張するもの)などのライブラリを調べる必要があります。 OpenGLは効率的なグラフィックスパイプラインを使用して2Dと3Dでレンダリングします –

答えて

1

Javaのコアライブラリは、効率的なグラフィックスレンダリングではなく、ユーザーインターフェイスを目的としています。 JavaFXはハードウェアアクセラレーションをサポートします。グラフィックの微調整が必​​要な場合は、LWJGLまたはLibGDXを参照してください。 LibGDXは抽象度が高く、LWJGLはOpenGL、OpenGLES、Vulkan APIに直接バインディングしています。

これらのライブラリを使用しない場合は、Javaでハードウェアアクセラレーションを有効にすることができます。私が知る限り、デフォルトでは有効になっていません。あなたは、JVMに次の引数を追加する必要があります。

-Dsun.java2d.opengl=true

あなただけの画像をレンダリングしている場合、BufferedImageを継続して使用する罰金になります。ただし、画像を頻繁に編集する場合は、代わりにVolatileImageを使用してください。

これは、Java2Dゲームのスピードアップに関する私の知識の程度です。私はこの質問hereを見ることをお勧めします。回答者は非常に知識が豊かで、同じ話題よりも深いところがあります。

+0

ありがとうございます。私はJOGL経由でOpenGLを使用しています。これはdrawTimeを高速化しています。時にはupdateTimeよりも高速です。 – Aschas

関連する問題