假设我有一个为屏幕加载所有资源的方法,该方法在该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为例,但我猜答案对任何资产都是正确的。
不,卸载时不必(也不得)处置它。通常,经验法则是:创建后就销毁了。因此,如果您创建纹理(通过使用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)在MyGame和MyScreen类中都调用,那么您assetManager.unload("image.png")也应该在MyGame和MyScreen类中都调用。
| 归档时间: |
|
| 查看次数: |
1225 次 |
| 最近记录: |