首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >LibGdx何时以及如何使用AssetManager处置资产?

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

Stack Overflow用户
提问于 2016-04-06 12:07:09
回答 2查看 1.9K关注 0票数 1

假设我有一个加载屏幕所有资产的方法,这个方法在屏幕构造函数中被调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void load(){
    manager.load(pd_bg, Texture.class, textureParams);
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void unLoad(){
    manager.unload(pd_bg);
}

在我的屏幕中,我可能会将这个资产用于雪碧,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Sprite bg = new Sprite(GdxAssetManager.manager.get(GdxAssetManager.pd_bg, Texture.class));

终于实现了,即使我调用了unLoad()方法,也需要处理这个sprite中使用的纹理吗?即:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void dispose(){
    GdxAssetManager.unLoad();
    bg.getTexture.dispose(); //Is this line needed?
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-06 14:19:01

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

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

因为您使用AssetManager关键字创建了new,所以您拥有它,并且负责调用它的dispose方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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“的资产,并且在您的MyGameMyScreen类中都调用了assetManager.unload("image.png"),那么您应该同时在MyGameMyScreen类中调用assetManager.unload("image.png")

票数 6
EN

Stack Overflow用户

发布于 2021-06-03 21:08:18

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

然后,在启动程序类中,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dispose(){}

方法首先卸载所有内容,然后调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
assetmanager.dispose();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36461313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文