Libgdx TileMap : 我应该怎么做才能有效地加载我的资源?

Libgdx TileMap : How should I do to load my ressources efficiently?

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

我的地图很少(3000*3000 格)。

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

我尝试生成所有过渡图块并使用 tmx 文件,但它需要大量 space 并且我尝试复制的游戏没有这些图块并且它启动很快.

所以我尝试创建一个 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 文件中所做的基本相同。我列出了我在可能的地图中使用它们所需的资源。

----算法---

对于每个图块 ID,我正在查找链接的纹理

如果纹理不包含在 TiledMapTileSet 中

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

其他

我把tile放到layer里了

---结束---

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

libgdx 加载如何与 tmx 文件一起工作以使其加载速度如此之快?

我应该如何高效地生成我的地图?

游戏中有关资源加载的最佳做法是什么?

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

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

你不会在你发布的代码中生成任何东西,只是加载大量的小纹理。您有什么理由不能将它们全部放入图集中以使其速度更快?您可以为每个地图部分制作一个地图集。

检查 AssetManager 和相关加载器的源代码,了解它们是如何工作的。许多加载可以在单独的线程上完成,而不会阻塞游戏。