Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的慢映射_Java_Graphics_2d Games - Fatal编程技术网

java中的慢映射

java中的慢映射,java,graphics,2d-games,Java,Graphics,2d Games,我正在用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 =

我正在用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();
    }

}
//tileset类的方法
公共void loadTileset(){
位置=新整数[1+tilex*tilesY][2];
int-yy=0;
int xx=0;
int指数=0;
//将每个磁贴的初始x点和y点保存在名为positions的数组中
//位置[tileNumber][0]-X位置
//位置[tileNumber][1]-Y位置
对于(inti=1;i
我做错什么了吗?
注意:我是论坛新手,更糟糕的是,我不太懂英语,请原谅我的错误。

首先,您不应该在每次通话中为互动程序创建子图像。严格地说,对于要绘制的图像,您根本不应该调用而不调用
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);
您可以将其更改为如下所示:

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)
方法可以获得内部存储的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);
    }
}
类TileSet
{
私人地图平铺图;
TileSet()
{
....
准备图像();
}
私有无效准备映像()
{
tileImages=newHashMap();
对于(int-tile:allpossibletilevaluesthatmap)
{
//这些是最初渲染的平铺
//在您的“绘制”方法中
BuffereImage图像=
getTileImage().getSubimage(
盖蒂莱克斯(瓷砖),
盖蒂利(瓷砖),
getTileWidth(),
getTileHeight());
//创建映像的新的托管副本,
//并将其存储在地图中
BuffereImage managedImage=转换为RGB(图像);
tileImage.put(tile,managedImage);
}
}
专用静态BuffereImage转换器为RGB(BuffereImage图像)
{
BuffereImage newImage=新的BuffereImage(
image.getWidth(),image.getHeight(),
BuffereImage.TYPE_INT_ARGB);
Graphics2D g=newImage.createGraphics();
g、 drawImage(image,0,0,null);
g、 处置();
返回新图像;
}    
//这是新方法:对于给定的“平铺”值
//在map[x][y]中找到的,返回
//适当的瓷砖:
公共缓冲区映像getTileImage(整块)
{
返回tileImages.get(tile);
}
}

这里很难看到任何明显的错误。您可能想尝试一个探查器(比如JDK中应该包含的
visualvm
),并使用它来查找花费时间最多的内容。您多久重新绘制一次地图?您使用的是哪种图像子类型?最后,AWT和Swing都是慢的,考虑更快的2D图形库。@ KalOLS AWT和Swing不是很慢。(无意冒犯,只是提一下…@Marco,与实际的面向游戏的库相比,它们是。嗯,也许不是AWT,我从来没有使用过它,但是在Swing中,我注意到在我用Slick2D重新绘制主窗口后,性能有了巨大的差异。我明白你的意思,我会试试。感谢您的帮助,大大改进了,即使渲染没有出现在屏幕上的区域也会慢慢停止。只是一个问题,我不明白为什么方法
convertToARGB()
,会​​如下所示:
tileImages.put(index,image.getSubimage(xx,yy,tileWidth,tileHeight);
。前面提到的方法的目的是什么?@Cairo我在中写了几句话,进一步的信息是,例如,在Ok,thnks寻求帮助@Marco13