【发布时间】:2016-09-09 09:37:30
【问题描述】:
我正在使用 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,而不会使它们相互冲突。
【问题讨论】: