Java - 如何有效地绘制图形

时间:2012-09-22 09:05:35

标签: java graphics draw

我在这里要做的是尽可能快地渲染游戏中的所有图形。 游戏是基于图块的,需要渲染大量图像。 我遇到的问题是需要很长时间来绘制所有图像。 我不知道我是否应该以特殊的方式绘制瓷砖,但现在我将逐个渲染视图端口内的所有瓷砖。

这是我的绘图方法:

public void draw(Graphics2D g){

    boolean drawn=false; // if player is drawn
    int px=vpPosX, py=vpPosY; // Viewport Position

    for(int y=Math.round(py/64); y<Math.round(py/64)+core.blcHeight; y++){
        for(int x=Math.round(px/64); x<Math.round(px/64)+core.blcWidth; x++){
            if(y<height && x<width && y>-1 && x>-1 && worldData[currentLayer][x][y] != 0){ // if tile is inside map
            BufferedImage img = tileset.tiles[worldData[currentLayer][x][y]]; //tile image
            if(-py+player.PosY+64-15 < (y*64)-py-(img.getHeight())+64 && drawn==false){player.draw(g);drawn=true;} // if player should be drawn
                if(worldBackground[currentLayer][x][y]!=0){ // if tile has background
                    BufferedImage imgBack = tileset.tiles[worldBackground[currentLayer][x][y]]; // background tile
                    g.drawImage(imgBack, (x*64)-px-(((imgBack.getWidth())-64)/2), (y*64)-py-(imgBack.getHeight())+64, null); //draw background
                }
                g.drawImage(img, (x*64)-px-(((img.getWidth())-64)/2), (y*64)-py-(img.getHeight())+64, null); // draw tile
            }
        }
    }

    if(!drawn){player.draw(g);} // if drawn equals false draw player

    }

所有图像都加载在tileset类中 游戏fps / ups被锁定在60 从具有游戏循环的核心类调用此方法。

我想知道的是我做错了什么? 我需要更改绘制方法吗?
我是否需要以特殊方式加载图像? 我需要改变我画画的方式吗?

我的目标是制作一款免费的二维拼图游戏。

我注意到自己的事情是我的缓存图像包含了瓷砖图像的RGBA格式。但是当我制作RGB时,渲染时间要少得多。我知道额外的信息需要更多的时间来绘制。但我不知道的是它到底有多少。

我找到了一件让表现更好的东西 如果我加载了所有图像并将其复制到以这种方式创建的图像中:

BufferedImage bi = ImageIO.read(ims[i]);
GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
BufferedImage b = gc.createCompatibleImage(bi.getWidth()*4, bi.getHeight()*4, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = b.createGraphics();
g.drawImage(bi, 0, 0, bi.getWidth()*4, bi.getHeight()*4, null);
tiles[id]=b;
g.dispose();

然后绘制所有瓷砖的时间减少了很多。 但它仍然会更好。 当我要制造光引擎时(例如地下)。 然后我将不得不在瓷砖上使用透明矩形。 或者,如果有人可以建议一种更好的方法,使瓷砖更暗,而不使用透明矩形。但事实是,当试图绘制透明矩形时也会出现滞后现象。我不知道我是否应该避免使用透明图像和矩形或什么。

希望有人能指出我正确的方向。

1 个答案:

答案 0 :(得分:1)

您可能会发现一些有用的技巧:

  • 如果您有很多静态背景图块,那么不会每帧重绘一次 - 只需将它们绘制一次到BufferedImage中并使用它来绘制整个背景一气呵成。如果其中一个图块发生更改或滚动屏幕等,则只需更新此背景图像。
  • 确保您仅绘制可见的图块。看起来你可能会这样做,但如果core.blcHeight和core.blcWidth太大,那么你可能会绘制太多的瓷砖。
  • 不要担心锁定到60FP 。对于基于区块的游戏,这可能不是必需的。我建议将游戏逻辑与帧速率分离,让游戏以任何速度渲染。
  • 对于纯色背景图块,不需要使用Alpha着色进行绘制。在某些情况下,这可以显着加快绘图速度。即,您可以使用TYPE_INT_RGB而不是TYPE_INT_ARGB

如果您真的想要高性能绘图/动画,那么您可能需要考虑切换到基于OpenGL的渲染引擎 - 例如Slick2DLWJGL