这里的情况:我正在开发一个旧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加载的游戏中最佳做法是什么?
答案 0 :(得分:0)
您正在分别加载每个图块,无论您做什么,都会很慢。读取大量较小的文件比读取一个大文件要慢。由于不必要的纹理切换,渲染速度也会很慢。您的地图非常大也无济于事。
最简单的方法是缩小地图的大小。设为300x300,现在加载时间快100倍。
您不会在您发布的代码中生成任何内容,只需加载大量的小纹理。你有什么理由不能把它们全部放在地图集中以使它有点快吗?您可以为每个地图部分制作地图集。
检查AssetManager
和相关加载器的来源,看看它是如何工作的。很多加载都可以在不同的线程上完成,而不会阻塞游戏。