我使用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,而不会相互冲突。
答案 0 :(得分:1)
看起来SkinLoader并不告诉AssetManager传入的resources
是依赖项,因此如果其中一个资源也是托管资产,则可能导致您遇到的问题。
因此,如果您不需要由AssetManager管理字体,您可以单独加载它,以便AssetManager不会处置它。
否则,我认为您需要在卸载或丢弃皮肤之前从皮肤中删除资源:
skin.remove("stay_writer_25.ttf", BitmapFont.class);