【问题标题】:How to reuse assets in libGDX?如何重用 libGDX 中的资产?
【发布时间】:2024-01-11 17:11:01
【问题描述】:

假设我有一个由资产管理器加载到内存中的带有Skin 的屏幕 A:

private Skin skin;
...
skin = (Skin)MyGame.ResourceManager.getAsset(AssetEnum.UISkin);
//UISkin("Menu/UISkin.json", Skin.class),

我需要加载同样引用AssetEnum.UISkin 的下一个屏幕B。简单的方法是

  1. 配置屏幕A
  2. 卸载屏幕A的资源
  3. 加载屏幕B的资源
  4. 初始化屏幕 B

但我想在屏幕 B 的资源仍在加载时在屏幕 A 上显示一些加载轮。有了这个扩展步骤看起来像

  1. 加载屏幕B的资源
  2. 初始化并设置屏幕 B
  3. 配置屏幕A
  4. 卸载屏幕A的资源

问题是当我在第三步调用 dispose 时,skin.dispose() 删除了我当前也需要的前一个屏幕的纹理。而这种情况每次在“加载屏幕B的资源”之后“配置屏幕A”时都会出现。有没有人有什么建议?请帮忙

【问题讨论】:

    标签: java android memory-management libgdx


    【解决方案1】:

    您可以创建一个单独的静态类来加载您的资产并保留它,直到您不再需要它为止。

    让我们调用这个类 AssetLoader。

    我假设您知道 java 的工作原理以及 libgdx 的工作原理。

    在 AssetLoader 类中,您创建 2 个方法

    Public static void load() {}
    

    Public static void dispose() {}
    

    还将你的皮肤声明为静态成员

    Public static Skin skin;
    

    在你的 load() 方法中加载你的皮肤,在你的 dispose() 方法中你编写你的处理方法。

    当您想要加载资产时,请致电

    AssetLoader.load();
    

    这些方法都是静态的,您不需要在整个代码中初始化 AssetLoader。就叫吧。

    当你想使用皮肤时(例如,你的 Screen1() 方法)

    UISkin("Menu/UISkin.json", AsssetLoader.Skin.class);
    

    最后,当你的游戏结束时,你调用

    Assetoader.dispose();
    

    你可以在 AssetLoader 中放入任何静态的东西。例如纹理和音轨。好处是您只需要在整个代码中调用一次 load() 方法,就可以在整个游戏过程中使用它。请记住在不再需要它时将其丢弃。

    编辑:您可以做的另一件事是使用 AssetManager 更多详情here

    【讨论】:

    • 这实际上可以工作,但我尝试分离每个屏幕的资源。如果我有静态成员,很难扩展这个系统。例如,每个屏幕可以有 50 个资产,而且我不知道屏幕推送的顺序。它可以是 A->B->C->D 或 A->D->A->C,我如何控制需要处置的资产?使用这种逻辑,我必须将所有可能可重用的对象设置为静态。
    • 目前我唯一能想到的就是:创建另一个类。将所需资源从 Screen1 传递到此类。然后告诉屏幕 2 访问该类。最后加载缺失资产的资产。
    • 天哪,我似乎不需要调用 skin.dispose(),因为它在资产管理器内部:D 谢谢您的建议!
    最近更新 更多