【问题标题】:Libgdx TileMap : How should I do to load my ressources efficiently?Libgdx TileMap:我应该如何有效地加载我的资源?
【发布时间】:2015-12-05 16:20:47
【问题描述】:

这里的情况:我正在开发一个旧的 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 文件中所做的基本相同。我列出了我在可能的地图中使用它们所需的资源。

----算法---

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

如果纹理不包含在 TiledMapTileSet 中

我将该纹理存储在 TileMapTileSet 然后我把瓦片放到图层中

其他

我把瓦片放到图层里

---结束---

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

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

如何高效地生成地图?

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

【问题讨论】:

    标签: java libgdx loading


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我在源代码中发现它的作用相同(在瓦片集中加载所有纹理并填充地图)。我发现我的方法findTextureByIdAndPos 太慢了,所以我修复了它,现在可以接受了。在 findTexture 方法期间需要时通过调用生成瓷砖(我暂时禁用了瓷砖生成)。我仍然不明白旧游戏如何快速加载所有纹理并在顶部生成其他纹理。
    猜你喜欢
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    相关资源
    最近更新 更多