代码之家  ›  专栏  ›  技术社区  ›  Green_qaue

LibGdx何时以及如何使用AssetManager处置资产?

  •  1
  • Green_qaue  · 技术社区  · 9 年前

    假设我有一个为Screen加载所有资源的方法,该方法在Screens构造函数中调用:

    public void load(){
        manager.load(pd_bg, Texture.class, textureParams);
    }
    

    现在,当我退出该屏幕时,我有一个卸载所有这些资产的方法:

    public void unLoad(){
        manager.unload(pd_bg);
    }
    

    在我的屏幕中,我可能会将此资源用于精灵,如下所示:

    Sprite bg = new Sprite(GdxAssetManager.manager.get(GdxAssetManager.pd_bg, Texture.class));
    

    最后 ,即使我调用了unLoad()方法,我也需要处理这个精灵中使用的纹理吗?即:

    public void dispose(){
        GdxAssetManager.unLoad();
        bg.getTexture.dispose(); //Is this line needed?
    }
    

    我还想知道,如果我在启动应用程序时加载所有资源,那么我应该在退出屏幕时卸载资源吗?下次如何加载它们(因为我只在启动时加载)?。 我以雪碧为例,但我想任何资产的答案都是正确的。

    2 回复  |  直到 9 年前
        1
  •  6
  •   Xoppa    9 年前

    不,当你卸下它时,你不必(也不能)处理它。一般来说,经验法则是: 如果你创造了它,你就摧毁了它 因此,如果创建纹理(通过使用 new 关键字),然后你 拥有 并负责破坏它(称其为 dispose 方法)。假使 AssetManager ,它是 资产经理 谁拥有资源并负责销毁它。

    跟踪需要哪些资源 创建 摧毁 , 资产经理 使用引用计数。所以你最终打电话给我很重要 unload 每次你打电话 load .

    因为你创造了 资产经理 使用 关键字,你拥有它,你负责调用它 处置 方法:

    public class MyGame extends ApplicationAdapter {
        public AssetManager assetManager;
    
        @Override public void create() {
            assetManager = new AssetManager();
            ...
        }
        ...
        @Override public void create() {
            assetManager.dispose();
            assetManager = null;
            ...
        }
    }
    

    查看文档: https://github.com/libgdx/libgdx/wiki/Managing-your-assets

    顺便说一句,在您的代码中,看起来您正在使用 static 资产管理器。尽管与您的问题无关,但请注意这将导致问题。所以我建议你实现一个正确的面向对象的设计,而不是制造东西 静止的 .

    至于你的第二个问题,不清楚你的意思。如果你是说你应该什么时候打电话 AssetManager#unload ,则答案是每当调用相应 AssetManager#load 方法不再需要它。

    例如,如果您有一个名为“image.png”的资产 assetManager.load("image.png", Texture.class) 在你的 MyGame MyScreen 然后你应该调用 assetManager.unload("image.png") 也在你的 魔幻战士 我的屏幕

        2
  •  0
  •   Kleysley    4 年前

    要回答最后两个问题: 在您的 发射器 类,您应该从所有屏幕加载所需的每个纹理。 然后,在屏幕中,您可以访问所需的图像 你不卸载它们,你也不处理它们,也不处理资产管理器。

    然后在你的 启动器类

    dispose(){}
    

    方法首先卸载所有东西,然后调用

    assetmanager.dispose();