我正在使用libgdx AssetManager加载带有自定义字体的皮肤。
当我调用assetmanager.dispose()时,它抛出一个异常:
com.badlogic.gdx.utils.GdxRuntimeException: Pixmap already disposed!
at com.badlogic.gdx.graphics.Pixmap.dispose(Pixmap.java:315)
at com.badlogic.gdx.graphics.g2d.PixmapPacker$Page$1.dispose(PixmapPacker.java:384)
at com.badlogic.gdx.graphics.g2d.BitmapFont.dispose(BitmapFont.java:315)
at com.badlogic.gdx.scenes.scene2d.ui.Skin.dispose(Skin.java:416)
at com.badlogic.gdx.assets.AssetManager.unload(AssetManager.java:211)
at com.badlogic.gdx.assets.AssetManager.clear(AssetManager.java:653)
at com.badlogic.gdx.assets.AssetManager.dispose(AssetManager.java:621)在尝试处理我添加的自定义字体时。我认为这是因为AssetManager先处理BitmapFont,然后再处理皮肤。但皮肤也在尝试处理BitmapFont。不可能切换加载皮肤和BitmapFont的顺序,因为皮肤在其加载过程中需要BitmapFont。
这是我加载皮肤和字体的地方:
FileHandleResolver resolver = new InternalFileHandleResolver();
app.assetManager.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver));
app.assetManager.setLoader(BitmapFont.class, ".ttf", new FreetypeFontLoader(resolver));
FreetypeFontLoader.FreeTypeFontLoaderParameter params = new FreetypeFontLoader.FreeTypeFontLoaderParameter();
params.fontFileName = "font/stay_writer.ttf";
params.fontParameters.size = 25;
app.assetManager.load("stay_writer_25.ttf", BitmapFont.class, params);
app.assetManager.finishLoading();
// Queue Skin
app.assetManager.load("skins/uiskin.atlas", TextureAtlas.class);
ObjectMap<String, Object> resources = new ObjectMap<String, Object>();
resources.put("default-font", app.assetManager.get("stay_writer_25.ttf", BitmapFont.class));
app.assetManager.load("skins/uiskin.json", Skin.class, new SkinLoader.SkinParameter("skins/uiskin.atlas", resources));我一直在调用assetmanager.update(),并确保加载皮肤。
我使用以下命令来处理AssetManager:
assetManager.dispose();这给了我Pixmap already disposed!错误。
我调试了BitmapFont.dispose()的调用。第一个调用的堆栈跟踪显示,该调用来自assetManager.unload(),第二个调用来自Skin.dispose(),它是从assetManager.unload()方法调用的。
现在我想知道是否有一种方法可以处理皮肤和BitmapFont,而不使它们相互冲突。
发布于 2016-09-09 20:46:53
因此,如果你不需要字体由AssetManager管理,你可以简单地单独加载它,这样AssetManager就不会处理它。
否则,我认为您需要在卸载或处理皮肤之前将资源从皮肤中移除:
skin.remove("stay_writer_25.ttf", BitmapFont.class);https://stackoverflow.com/questions/39408448
复制相似问题