Assetmanager和Skin处理Font(/ Skin)

时间:2016-09-09 09:37:31

标签: java libgdx dispose

我使用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,而不会相互冲突。

1 个答案:

答案 0 :(得分:1)

看起来SkinLoader并不告诉AssetManager传入的resources是依赖项,因此如果其中一个资源也是托管资产,则可能导致您遇到的问题。

因此,如果您不需要由AssetManager管理字体,您可以单独加载它,以便AssetManager不会处置它。

否则,我认为您需要在卸载或丢弃皮肤之前从皮肤中删除资源:

skin.remove("stay_writer_25.ttf", BitmapFont.class);
相关问题