假设我有一个加载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作为例子,但我想任何资产的答案都是正确的。
答案 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")
也适用于MyGame
和MyScreen
类。
答案 1 :(得分:0)
回答您的最后两个问题: 在您的启动器 类中,您应该从所有屏幕加载您需要的所有纹理。 然后在您的屏幕中访问您需要的图像,您不卸载它们,也不处置它们,也不处置资产管理器。
然后在您的启动器类中
dispose(){}
首先卸载所有东西然后调用的方法
assetmanager.dispose();