【问题标题】:Libgdx Skin dispose behaviorLibgdx 皮肤处置行为
【发布时间】:2015-12-24 22:26:55
【问题描述】:

我有一个关于 libgdx 皮肤行为的问题。 我正在开发的游戏有一个全局 AssetsManager(来自 libgdx 套件),每个类都可以访问它。 我在这个资产管理中加载了不同的 TextureAtlas 我知道assetManager.dispose() 会释放资产管理器中加载的所有资源。

现在,我还想在资产管理器中加载一个皮肤(用于 GUI)。 皮肤会用到几个TextureAtlas...

这里的问题是:因为我要使用 skin.addRegion() 并且关于皮肤类的在线 API 参考说“当皮肤被释放时,地图集不会被自动释放”加载是一个好主意全局资产管理器中皮肤的所有TextureAtlas?

我担心 dispose 操作。因为当我调用assetManager.dispose() 时,TextureAtlas 和Skin 都会在dispose 方法上被调用……但是如果TextureAtlas 在皮肤之前被处理呢? 实际上会发生什么问题吗?

皮肤行为没有那么明确,我的意思是...... dispose 方法是做什么的?

提前致谢,

卢卡

【问题讨论】:

  • 我忘了说,另一方面,在线 API 参考说(关于皮肤的 dispose() 方法):“在皮肤中处理 TextureAtlas 和所有 Disposable 资源”。

标签: libgdx assets skin


【解决方案1】:

我不想发布 anwser,但我无法使用代码发布评论 -_-。

好的,如果情况如下: `

assetManager.load("images/guiTextureAtlas", TextureAtlas.class);
assetsManager.load("skin/uiSkin.json", Skin.class)";

assetsManager.finishLoading();

Skin uiSkin = assetManager.get("skin/uiSkin.json");
uiSkin.addRegion(assetManager.get("images/guiTextureAtlas");

`

如果我调用assetManager.dispose() 来处理所有资源,这一切都好吗?

【讨论】:

  • 我这样做是因为我想在资产管理器中加载一个完整的皮肤(json + TextureAtlas)......但是皮肤加载器只接受 .json 文件的文件描述符。 ..
  • 或者,也许我误解了 SkinLoader 的含义...实际上它似乎使文档变得如此混乱!
【解决方案2】:

skin.dispose() 调用处置Disposable 的任何特定资源。但 TextureAtlas 本身不是“资源”之一,因此必须手动将其与皮肤分开处理。

我能想到的一次性皮肤资源的唯一示例是 BitmapFont,它不使用您在 Skin 中使用的 TextureAtlas。

请注意,您永远不应在使用 AssetManager 加载的内容上调用 dispose。相反,您应该在该资源上调用 manager.unload(),以便 AssetManager 可以正确管理依赖关系。

manager.unload() 的好处在于它会跟踪有多少其他资源依赖于该对象,并且仅在没有依赖关系时才释放它。因此,如果您还使用 AssetManager 加载您的皮肤,您只需要担心调用manager.unload("mySkin"),它会正确确定是否也应该释放关联的 TextureAtlas。

但请确保每次在同一资源上调用 load() 时,只对资源调用一次 unload()。 AssetManager 的内部依赖计数确实依赖于您所有的 load()unload() 调用,它们相互一对一地镜像。

【讨论】:

    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 2014-09-11
    • 2014-04-18
    • 1970-01-01
    • 2017-04-27
    • 2014-06-22
    • 1970-01-01
    • 2016-09-12
    相关资源
    最近更新 更多