LibGDX Skin附加资源依赖性问题

时间:2018-02-13 06:55:36

标签: libgdx dependencies assets dispose skin

我想知道我是否做错了(最有可能)或者LibGDX SkinLoader是否存在关于其他资源依赖性的问题。

根据SkinLoader.SkinParameter的文档,您可以传递一个额外的ObjectMap来定义皮肤所依赖的资源。

我想将它用于位图字体,因为我在运行时使用.ttf文件创建它们,以便能够为目标设备显示的正确密度/大小创建正确的字体大小。

以下是导致此问题的示例程序:

public class Test extends Game {
  private AssetManager assetManager;
  private Skin skin;
  private Batch batch;

  @Override
  public void create() {
    this.assetManager = new AssetManager();
    final FileHandleResolver resolver = new InternalFileHandleResolver();
    assetManager.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver));
    assetManager.setLoader(BitmapFont.class, ".ttf", new FreetypeFontLoader(resolver));

    final ObjectMap<String, Object> resources = new ObjectMap<String, Object>();
    final FreetypeFontLoader.FreeTypeFontLoaderParameter fontParam = new FreetypeFontLoader.FreeTypeFontLoaderParameter();
    fontParam.fontFileName = "ui/font.ttf";
    fontParam.fontParameters.size = (int) (16 * Gdx.graphics.getDensity());
    assetManager.load("font16.ttf", BitmapFont.class, fontParam);
    assetManager.finishLoading();
    resources.put("font_16", assetManager.get("font16.ttf", BitmapFont.class));

    assetManager.load("ui/ui.json", Skin.class, new SkinLoader.SkinParameter(resources));
    assetManager.finishLoading();
    skin = assetManager.get("ui/ui.json", Skin.class);

    batch = new SpriteBatch();
  }

  @Override
  public void render() {
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    batch.begin();
    skin.get("font_16", BitmapFont.class).draw(batch, "Test123", 10, 10);
    batch.end();
  }

  @Override
  public void dispose() {
    super.dispose();
    // enabling the next line will get rid of the Pixmap already disposed exception
    // skin.remove("font_16", BitmapFont.class);
    assetManager.dispose();
    batch.dispose();
  }
}

现在当在程序的末尾处理assetManager时,我得到了一个异常“Pixmap already dispos”,因为位图字体被多次处理(一次处理Skin时,一次处理Bitmap字体本身时)。

为了解决这个问题,我现在在assetManager.dispose()之前调用 skin.remove(fontName,BitMapFont.class),只释放一次位图字体但是 imo this这不是一个好方法,我希望assetManager的依赖处理应该处理这个。

我检查了SkinLoader类的代码,对我而言,似乎那些传递的资源不会作为Skin的依赖项添加,这就是发生此错误的原因。

我现在的问题是: 我做错了什么或者是否有人有一个有效的代码来展示如何以正确的方式使用resourcesmap?

找到与此相关的topic,但似乎从未得到真正的答案

1 个答案:

答案 0 :(得分:0)

我得到了我需要的答案。实际上这不是资产经理的问题。这是Skin类的一个问题。

查看dispose方法:

SELECT dipi.id AS dipi_id,dipi.foo AS dipi_foo,dipi.bar AS dipi_bar, rvdii.id AS rvdii_id,rvdii.foo AS rvdii_foo,rvdii.bar AS rvdii_bar
FROM schema1.mytable dipi
FULL OUTER JOIN schema2.mytable rvdii on dipi.id = rvdii.id AND dipi.foo = rvdii.foo AND dipi.bar = rvdii.bar
WHERE dipi.id is null or rvdii.id is null

它直接处理任何资源,然后当然没有反映在资产管理器中,因此资产管理器也会处理创建的位图字体。

为了解决这个问题,我编写了自己的loader和Skin类。如果有人对此感兴趣,请输入代码:

public void dispose () {
    if (atlas != null) atlas.dispose();
    for (ObjectMap<String, Object> entry : resources.values()) {
        for (Object resource : entry.values())
            if (resource instanceof Disposable) ((Disposable)resource).dispose();
    }
}