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

时间:2016-04-06 20:07:10

标签: libgdx

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

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

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

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

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

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?
}

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

2 个答案:

答案 0 :(得分:5)

不,卸载时不需要(也不得)处理它。一般来说,经验法则是:如果您创建它,则将其销毁。因此,如果您创建纹理(使用new关键字),那么您拥有该纹理并负责销毁它(调用其dispose方法)。在AssetManager的情况下,AssetManager拥有资源并负责销毁资源。

要跟踪需要创建销毁的资源,AssetManager使用引用计数。因此,每次拨打unload时,最终都要致电load

由于您使用AssetManager关键字创建了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;
        ...
    }
}

查看文档:{​​{3}}

顺便说一句,在你的代码中看起来你正在使用static AssetManager。虽然与您的问题无关,但请注意这会导致问题。因此,我建议您实施适当的面向对象设计,而不是制作static

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

例如,如果您有一个名为“image.png”的资产,而您在assetManager.load("image.png", Texture.class)MyGame课程中调用MyScreen,则应致电assetManager.unload("image.png")也适用于MyGameMyScreen类。

答案 1 :(得分:0)

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

然后在您的启动器类

dispose(){}

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

assetmanager.dispose();