有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的图形慢映射

我正在用java做一个游戏,是一个rpg,但是,只有用地图的游戏才慢。 这张地图是制作的​​因此,在TileMap编辑器中,读取并加载到ArrayList中的XML。我的电脑是双核3.0,4GB内存,1GB视频。 执行渲染的步骤如下所示:

//method of tileset class
public void loadTileset(){
    positions = new int[1 + tilesX * tilesY][2];
    int yy = 0;
    int xx = 0;
    int index = 0;
    // save the initial x and y point of each tile in an array named positions 
    // positions[tileNumber] [0] - X position 
    // positions[tileNumber] [1] - Y position
    for(int i = 1 ; i < positions.length; i++){ 
        if(index == tilesX ){
            yy += tileHeight;
            xx = 0;
            index = 0;
        }
        positions[i][0] = xx;
        positions[i][1] = yy;
        xx += tileWidth;    
        index++;
    }
}


//method of map class
public void draw(Graphics2D screen){
    //x and y position of each tile on the screen
    int x = 0; int y = 0;

    for(int j = 0; j < 20 ; j++){
        for(int i = initialTile ; i < initialTile + quantTiles  ; i++){
            int tile = map[j][i];
            if(tile != 0){
                screen.drawImage(tileSet.getTileImage().getSubimage(tileSet.getTileX(tile), tileSet.getTileY(tile),tileSet.getTileWidth(), tileSet.getTileHeight()),x,y,null);
            }
            x += tileSet.getTileWidth();
        }
        x = 0;
        y += tileSet.getTileHeight();
    }

}

我做错什么了吗? 注意:我是论坛的新手,更糟糕的是我不太懂英语,所以请原谅我的错误


共 (1) 个答案

  1. # 1 楼答案

    首先,您不应该在每次调用期间为磁贴创建子图像。严格地说,对于要绘制的图像,您应该完全不要调用getSubimage:这将使图像处于“非托管”状态,这可能会使渲染性能降低一个数量级。对于不想渲染的图像,您应该只调用getSubimage,例如,当您最初为瓷砖创建单个图像时

    显然你已经有了一个TileSet类。你可以在这个类中添加一些功能,这样你就可以直接访问瓷砖的图像了

    您当前的代码如下所示:

    screen.drawImage(
        tileSet.getTileImage().getSubimage(
            tileSet.getTileX(tile), 
            tileSet.getTileY(tile),
            tileSet.getTileWidth(), 
            tileSet.getTileHeight()),
        x,y,null);
    

    你可以把它改成这样:

    screen.drawImage(tileSet.getTileImage(tile), x,y,null);
    

    这里建议的getTileImage(int tile)方法可以获得内部存储的磁贴

    我将从我的脑海中勾勒出几行代码,您可能能够将其转移到TileSet类中:

    class TileSet
    {
        private Map<Integer, BufferedImage> tileImages;
    
        TileSet()
        {
            ....
            prepareTileImages();
        }
    
        private void prepareTileImages()
        {
            tileImages = new HashMap<Integer, BufferedImage>();
    
            for (int tile : allPossibleTileValuesThatMayBeInTheMap)
            {
                // These are the tiles that you originally rendered
                // in your "draw"-Method
                BufferedImage image = 
                    getTileImage().getSubimage(
                        getTileX(tile), 
                        getTileY(tile),
                        getTileWidth(), 
                        getTileHeight());
    
                // Create a new, managed copy of the image,
                // and store it in the map
                BufferedImage managedImage = convertToARGB(image);
                tileImages.put(tile, managedImage);
            }
        }
    
        private static BufferedImage convertToARGB(BufferedImage image)
        {
            BufferedImage newImage = new BufferedImage(
                image.getWidth(), image.getHeight(),
                BufferedImage.TYPE_INT_ARGB);
            Graphics2D g = newImage.createGraphics();
            g.drawImage(image, 0, 0, null);
            g.dispose();
            return newImage;
        }    
    
        // This is the new method: For a given "tile" value
        // that you found at map[x][y], this returns the
        // appropriate tile:
        public BufferedImage getTileImage(int tile) 
        {
            return tileImages.get(tile);
        }
    }