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

Gre*_*aue 0 libgdx

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

public void load(){
    manager.load(pd_bg, Texture.class, textureParams);
}
Run Code Online (Sandbox Code Playgroud)

现在,当我退出该屏幕时,可以使用e方法卸载所有这些资产:

public void unLoad(){
    manager.unload(pd_bg);
}
Run Code Online (Sandbox Code Playgroud)

在我的屏幕内部,我可能将此资产用于Sprite,如下所示:

Sprite bg = new Sprite(GdxAssetManager.manager.get(GdxAssetManager.pd_bg, Texture.class));
Run Code Online (Sandbox Code Playgroud)

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

public void dispose(){
    GdxAssetManager.unLoad();
    bg.getTexture.dispose(); //Is this line needed?
}
Run Code Online (Sandbox Code Playgroud)

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

Xop*_*ppa 5

不,卸载时不必(也不得)处置它。通常,经验法则是:创建后就销毁了。因此,如果您创建纹理(通过使用new关键字),则您拥有该纹理并负责销毁它(调用其dispose方法)。对于AssetManager,是AssetManager谁拥有资源并负责销毁它。

为了跟踪需要创建销毁哪些资源,请AssetManager使用引用计数。因此,重要的是您unload每次通话时都要最终通话load

并且由于创建了AssetManagerusing new关键字,因此您拥有它,并且有责任调用它的dispose方法:

public class MyGame extends ApplicationAdapter {
    public AssetManager assetManager;

    @Override public void create() {
        assetManager = new AssetManager();
        ...
    }
    ...
    @Override public void create() {
        assetManager.dispose();
        assetManager = null;
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句,在您的代码中,您好像正在使用staticAssetManager。尽管与您的问题无关,但是请注意,这会导致问题。所以我建议您实施适当的面向对象的设计而不是做事static

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

例如,如果您有一个名为“ image.png”的资产,并且assetManager.load("image.png", Texture.class)MyGameMyScreen类中都调用,那么您assetManager.unload("image.png")也应该在MyGameMyScreen类中都调用。