如果我有几个.tmx文件使用相同的tileSet,显然我只想加载一次tileSet纹理,但是如果我使用常规方法来做,纹理加载两次... < / p>
TmxMapLoader loader = new TmxMapLoader();
TiledMap tiledMap1 = loader.load("map-test.tmx");
TiledMap tiledMap2 = loader.load("map-test.tmx");
Texture texture1 = tiledMap1.getTileSets().getTile(1).getTextureRegion().getTexture();
Texture texture2 = tiledMap2.getTileSets().getTile(1).getTextureRegion().getTexture();
// texture1 is different than texture2
所以我的问题是,有没有办法避免地图多次加载相同的资产?
我可能会写完自己的TmxLoader,因为我不希望它从图像层加载图像,但用实际的游戏对象替换它们......但我想知道 vanilla 方式......
修改 David Saltares提供的解决方案就是我需要的解决方案,所以我会留下正确的代码:
// supossing that both maps use the same tileset image...
TmxMapLoader loader = new TmxMapLoader();
assetManager.setLoader(TiledMap.class, loader);
assetManager.load("map-test1.tmx", TiledMap.class);
assetManager.load("map-test2.tmx", TiledMap.class);
assetManager.finishLoading();
TiledMap tiledMap1 = assetManager.get("map-test1.tmx");
TiledMap tiledMap2 = assetManager.get("map-test2.tmx");
Texture texture1 = tiledMap1.getTileSets().getTile(1).getTextureRegion().getTexture();
Texture texture2 = tiledMap2.getTileSets().getTile(1).getTextureRegion().getTexture();
// now texture1 == texture2 :)
我想知道的是,为什么这不是默认值?我的意思是,默认情况下,assetManager有很多加载器,但不是tmx加载器......
答案 0 :(得分:1)
使用AssetManager
,调用其setLoader
方法传递TmxMapLoader
的新实例。
通过资产管理器加载地图时,tmx加载程序将尝试处理它并告诉资产管理器所有依赖项。其中一个依赖项将是tile的纹理。资产管理器将满足依赖关系,然后实际上会加载地图。
管理者下的所有资产都被引用计数,因此在同一句柄上调用load()
,实际上不会分配更多内存。
这意味着,当加载第二个映射并且管理器尝试满足其依赖关系时,它将发现纹理已经加载。它只会将引用计数增加一个。