gpt4 book ai didi

java - Assetmanager 和 Skin 处理 Font(/Skin)

转载 作者:行者123 更新时间:2023-11-30 02:48:32 26 4
gpt4 key购买 nike

我正在使用 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已经处置!错误。
我调试了 BitmapFont.dispose() 的调用。第一个调用的堆栈跟踪显示该调用来自 assetManager.unload(),第二个调用来自 Skin.dispose(),它是从 >assetManager.unload() 方法。

现在我想知道是否有一种方法可以处理皮肤和 BitmapFont,而不使它们相互冲突。

最佳答案

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

因此,如果您不需要 AssetManager 管理该字体,您可以简单地独立加载它,这样 AssetManager 就不会丢弃它。

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

skin.remove("stay_writer_25.ttf", BitmapFont.class);

关于java - Assetmanager 和 Skin 处理 Font(/Skin),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39408448/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com