Libgdx TileMap:我该如何有效地加载我的资源?

时间:2015-12-05 16:20:48

标签: java libgdx loading

这里的情况:我正在开发一个旧Tiled基础游戏的克隆。我正在使用LIBGDX api。我想知道如何管理我的资源加载。

我有几张地图(3000 * 3000张)。

我可以轻松使用tmx文件来表示我的地图并加载它但是: 我的所有地板纹理都是在不同的瓷砖中切割的大型无缝纹理,我需要在它们之间动态生成过渡切片。

我尝试生成所有过渡切片并使用tmx文件,但它占用了大量空间,而我正在尝试复制的游戏没有这些切片并且它会快速启动。

所以我尝试通过阅读我得到的基本地图文件来创建一个TileMap。

这里是代码:

        MapLayers layers = worldMap.getLayers();
        TiledMapTileSets tileSets  = worldMap.getTileSets();
        TiledMapTileLayer floorLayer = new TiledMapTileLayer(WORLD_WIDTH,WORLD_HEIGHT,TILE_WIDTH, TILE_HEIGHT);
        TiledMapTileSet floorTileSet = new TiledMapTileSet();
        layers.add(floorLayer);
        tileSets.addTileSet(floorTileSet);

        floorLayer.setCell(0, 0, new Cell());
        byte[] rawData = null;
        try {
            rawData = java.nio.file.Files.readAllBytes(Paths.get(".."+System.getProperty("file.separator")+"core"+System.getProperty("file.separator")+"assets"+System.getProperty("file.separator")+"map"+System.getProperty("file.separator")+"v2_worldmap.map"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        CompressedMap originalMap = new CompressedMap(rawData);
        UncompressedMap uncompMap = originalMap.getUncompressedMap();
        NormalizedMap normalizedMap = uncompMap.getNormalizedMap();

        int originalMapTileid = 20;
        int newTileId = 0;
        int tileSetId = 0;
        for(int y = 0; y < 3072; y++){
            for(int x = 0; x < 3072 ;x++){
                floorLayer.setCell(x, 3071-y, new Cell());
                originalMapTileid = normalizedMap.getIdAtPos(x, y);

                String textname = ToolKit.findTextureNameByIdAndPos(assetManager, (short) originalMapTileid, x, y);
                if(!textureNameToTileId.containsKey(textname)){
                    textureNameToTileId.put(textname, newTileId);
                    //System.out.println(ToolKit.textPathTable.get(textname).toString());
                    floorTileSet.putTile(newTileId, new StaticTiledMapTile(new TextureRegion(new Texture(ToolKit.textPathTable.get(textname)))));
                    tileSetId = newTileId;
                    newTileId++;
                }else{
                    tileSetId  = textureNameToTileId.get(textname);
                }
                floorLayer.getCell(x, 3071-y).setTile(floorTileSet.getTile(tileSetId));
            }
        }

我在这里做的基本上与在Tmx文件中相同。我列出了他们在may map中使用它们所需的资源。

---- Algorythm ---

对于每个tile id,我找到链接的纹理

如果纹理未包含在TiledMapTileSet

我将该纹理存储在TileMapTileSet中    然后我将瓷砖放入图层

否则

我将瓷砖放入图层

--- ---端

要计算并加载资源,大约需要2分钟。它很多,在旧游戏中它比那更快(20秒)。实际上,如果我使用tmx也会更快,但我之前不会为转换生成所有平铺。

libgdx加载如何与tmx文件一起使用以加快加载速度?

如何有效地生成地图?

关于ressources加载的游戏中最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

您正在分别加载每个图块,无论您做什么,都会很慢。读取大量较小的文件比读取一个大文件要慢。由于不必要的纹理切换,渲染速度也会很慢。您的地图非常大也无济于事。

最简单的方法是缩小地图的大小。设为300x300,现在加载时间快100倍。

您不会在您发布的代码中生成任何内容,只需加载大量的小纹理。你有什么理由不能把它们全部放在地图集中以使它有点快吗?您可以为每个地图部分制作地图集。

检查AssetManager和相关加载器的来源,看看它是如何工作的。很多加载都可以在不同的线程上完成,而不会阻塞游戏。