如何将许多小图像拼接成一个大图像?

时间:2014-12-09 20:22:14

标签: java performance image-processing

我正在制作游戏。这是一个2D游戏,地图是通过双循环绘制的:

for(int i = 0; i < mapArray.length; i++){
   for(int j = 0; j < mapArray[1].length; j++){
     //if statement for if its on the screen
     g.drawImage(tiles.get(mapArray[i][j]).getImage(), j * textureSize, i * textureSize, null);

   }
}

它们是32x32图像,我想知道将它们拼接在一起以创建一个大图像在开始时将更有效地绘制。生成的图像仅为1500x1500左右。

我正在考虑将它拼接成一个图像(特别是因为我计划将图像缩小,这会使循环需要更多的时间。)因此它不必每次都经过双循环它渲染的时间(拍摄60 FPS)。但我不知道该怎么做,如果我这样做,它会不会真正提高性能呢?

另外,我可以将它们拼接成行,并且只渲染屏幕上的行(以消除大图像问题)所以它仍然比我现在所拥有的疯狂循环密集得多。

编辑:最后一件事,如果你能提供一个如何做这个的例子而不用最佳的额外库。

我目前有这个拼接代码:

编辑:现在有效。将此留给未来的读者:

 public void stitchImages(){

    BufferedImage temp = new BufferedImage( <Width> , <height> , BufferedImage.TYPE_INT_RGB);
    Graphics2D g = (Graphics2D) temp.getGraphics();

    for (int b = 0; b < mapArray.length; b++) {
        for (int a = 0; a < mapArray[b].length; a++) {


                g.drawImage(tiles.get(mapArray[b][a]).getImage(),
                        (int) mapX + a * textureSize, (int) mapY + b
                                * textureSize, null);



        }
    }


    mapImage = temp;


}

1 个答案:

答案 0 :(得分:1)

创建一个新图像以封装所有图像。加载时绘制图像,然后在paintComponent()

中绘制它
BufferedImage im = new BufferedImage(1500,1500,BufferedImage.TYPE_INT_RGB);

private void init() {

    Graphics g = im.getGraphics();

    for(int i = 0; i < mapArray.length; i++){
       for(int j = 0; j < mapArray[1].length; j++){
         //if statement for if its on the screen
         g.drawImage(tiles.get(mapArray[i][j]).getImage(), j * textureSize, i * textureSize, null);

       }
    }
}

public void paintCompoent(Graphics g) {
  super.paintComponent(g);
  g.drawImage(im,0,0,null);
}

编辑:

至于你想要只绘制屏幕上的线条的想法,你可以通过创建一个Image窗口大小并只绘制它来实现。但总的来说,绘制一个大图像并不是一个大问题(只要图像适合内存并且你不会得到OutOfMemoryException),因为你的GPU能力吸引你的CPU和# 39; s