2014-12-03 52 views
0

我正在构建一个游戏,我需要将〜30个64x64块渲染到屏幕。 通常我会用libgdx做类似的工作,但这次我想使用本地Java方法。高效地渲染多个图像

对于一个样本测试,我加载10块并渲染它们 - 将我的fps从大约300下降到35. 我在这里的笔记本电脑有点不好,但我没想到他这么早就崩溃了。如果你只是看看我的代码,并给我提示如何更有效地渲染 - 这将是很好的。我想我也没有100%的理解BufferedImage和Graphics的概念。

顺便说一句,我的规格是: *睿i5-2520M CPU @ 2.5GHZ(获得30%左右的工作量,同时调试) * 4GB内存 * NO GPU

---------- ------- CODE ----------------------------------------

的图形和图像的声明:

public BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
public Graphics2D g; 

的环路

while (running) { 
     long now = System.nanoTime(); 
     unprocessed += (now - lastTime)/nsPerTick; 
     GraphicUtil.setDelta(now - lastTime); 
     lastTime = now; 
     boolean shouldRender = true; 

     while (unprocessed >= 1) { 
      ticks++; 
      gameTick(); 
      unprocessed -= 1; 
      shouldRender = true; 
     } 

     if (shouldRender) { 
      frames++; 
      input.tick(); 
      render(); 
     } 


     if (System.currentTimeMillis() - lastTimer1 > 1000) { 
      lastTimer1 += 1000; 
      System.out.println(ticks + " ticks, " + frames + " fps"); 
      frames = 0; 
      ticks = 0; 
     } 
    } 

渲染() - 在我的主循环方法

public void render() { 
    BufferStrategy bs = getBufferStrategy(); 
    if(bs == null) { 
     createBufferStrategy(2); 
     return; 
    } 

    switch(currentScreenId) { 
    case Screen.MENUSCREENID : 
     menuScreen.handleInput(); 
     menuScreen.render(); 
     break; 
    case Screen.HOWTOSCREENID : 
     howToScreen.handleInput(); 
     howToScreen.render(); 
     break; 
    case Screen.GAMESCREENID : 

     gameScreen.handleInput(); 
     gameScreen.render(); 

     break; 
    } 

    Graphics g2 = bs.getDrawGraphics(); 
    g2.drawImage(GraphicUtil.toCompatibleImage(image), 0, 0, getWidth(), getHeight(), null); 
    g2.dispose(); 
    // 

    bs.show(); 
} 

渲染() - 在我gameScreen

public void render() { 
    clearScreen(Color.BLACK); 

    //Render blocks 
    for(Block b : blocks.values()) { 
     game.g.drawImage(blockImage, (int) b.getBounds().x, (int) b.getBounds().y, blockImage.getWidth(null), blockImage.getHeight(null), null); 
    } 
} 

回答

0

首先

将图像转换为兼容的颜色模型方法为设备,所以他们不需要在飞行中转换...

GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); 
BufferedImage img = gc.createCompatibleImage(width, height, image.getTransparency()); 
Graphics2D g2d = img.createGraphics(); 
g2d.drawImage(master, 0, 0, null); 
g2d.dispose(); 

如果块不改变(即是背景),他们画的BufferedImage(缓冲区)当您加载它们,然后绘制缓冲区的Graphics上下文来代替。

我还鼓励您将想要使用的Graphics上下文传递给renderer方法,因为它在绘画时可能会发生变化。