假设我有一个加载屏幕所有资产的方法,这个方法在屏幕构造函数中被调用:
public void load(){
manager.load(pd_bg, Texture.class, textureParams);
}
现在,当我退出屏幕时,我有了卸载所有这些资产的e方法:
public void unLoad(){
manager.unload(pd_bg);
}
在我的屏幕中,我可能会将这个资产用于雪碧,如下所示:
Sprite bg = new Sprite(GdxAssetManager.manager.get(GdxAssetManager.pd_bg, Texture.class));
终于实现了,即使我调用了unLoad()方法,也需要处理这个sprite中使用的纹理吗?即:
public void dispose(){
GdxAssetManager.unLoad();
bg.getTexture.dispose(); //Is this line needed?
}
我还想知道,如果我在启动应用程序时加载所有资源,那么我是否应该在退出屏幕时卸载资源呢?那么,下一次将如何加载它们(因为我只加载启动)?我以雪碧为例,但我想答案对任何资产都是正确的。
发布于 2016-04-06 14:19:01
不,当你卸载它时,你不需要(也不能)把它处理掉。一般来说,经验法则是:如果你创造它,你就摧毁它。因此,如果您创建一个纹理(使用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;
...
}
}
查看文档:https://github.com/libgdx/libgdx/wiki/Managing-your-assets
顺便说一句,在您的代码中,看起来您使用的是static
AssetManager。尽管与你的问题无关,但要意识到这会导致问题。因此,我建议您实现一个正确的面向对象的设计,而不是static
。
至于你的第二个问题,你的意思还不清楚。如果您的意思是什么时候应该调用AssetManager#unload
,那么答案是每当调用相应的AssetManager#load
方法的类不再需要它时。
例如,如果您有一个名为"image.png“的资产,并且在您的MyGame
和MyScreen
类中都调用了assetManager.unload("image.png")
,那么您应该同时在MyGame
和MyScreen
类中调用assetManager.unload("image.png")
。
发布于 2021-06-03 21:08:18
要回答最后两个问题:在启动程序类中,您应该从所有屏幕加载所需的每个纹理。然后,在屏幕中访问所需的图像,不卸载它们,也不释放它们,也不处理资产管理器。
然后,在启动程序类中,
dispose(){}
方法首先卸载所有内容,然后调用
assetmanager.dispose();
https://stackoverflow.com/questions/36461313
复制相似问题