正确处理LibGDX AssetManager

正确处理LibGDX AssetManager,libgdx,Libgdx,因此,我在LibGDX中制作了一个游戏,使用AssetManager加载我的所有资产。 我只是不知道用哪种方法才合适 目前我正在加载第一个屏幕之前的所有游戏资产。 然后,我清除dispose方法中的manager。但这意味着我有一堆纹理 等,我不需要所有的屏幕。这会导致内存泄漏吗 我想到的另一种方法是只加载每个屏幕所需的资产,然后 在每个screens hide()方法中卸载它们 所以我想知道这两种方法中哪一种是最好的方法,或者是否有 一个更好的处理方法 首先谢谢你:如果你是在Android上开

因此,我在LibGDX中制作了一个游戏,使用AssetManager加载我的所有资产。 我只是不知道用哪种方法才合适

目前我正在加载第一个屏幕之前的所有游戏资产。 然后,我清除dispose方法中的manager。但这意味着我有一堆纹理 等,我不需要所有的屏幕。这会导致内存泄漏吗

我想到的另一种方法是只加载每个屏幕所需的资产,然后 在每个screens hide()方法中卸载它们

所以我想知道这两种方法中哪一种是最好的方法,或者是否有 一个更好的处理方法

首先谢谢你:如果你是在Android上开发的,每次用户接听电话或切换到其他应用程序时,都会调用
hide()
。这意味着您必须在
show()
中重新分配资源。对于资源密集型游戏,如RPG,这可能会导致在游戏重新分配图形等时出现令人讨厌的黑屏。这并不有趣

第二:在游戏开始时要小心优化游戏。如果出现内存不足错误,一些忘记处理的菜单图形可能不是瓶颈

有了这些要点,我发现实现资产加载器的最简单方法是拥有一个单独的
Assets
类,如下所示:

public static AssetManager manager;
public static TextureAtlas myGraphics;
public static TextureAtlas myOtherGraphics;

public static void create() {
    manager = new AssetManager();
    load();
}

private static void load() {
    manager.load("mygraphics.pack", TextureAtlas.class);
    manager.load("myothergraphics.pack", TextureAtlas.class);
}

public static void done() {
    myGraphics = manager.get("mygraphics.pack", TextureAtlas.class);
    myOtherGraphics = manager.get("myothergraphics.pack", TextureAtlas.class);
}

public static void dispose() {
    manager.dispose();
}
然后,在加载屏幕的
render()
方法中,只需调用
Assets.manager.update()
——如果返回true,则调用
Assets.done()
,然后继续游戏

这种方法有一些好处。首先,它允许您将所有资产加载逻辑保存在一个类中。其次,如果您需要手动处置资源,只需调用
Assets.myGraphics.dispose()

如果您发现在启动过程中要加载的图形数据太多(例如Android上有10 MB的sprites),您也可以尝试将图形数据分解为离散块。在我的游戏中,每个精灵都有一个单独的TextureAtlas,每个TextureAtlas在加载时都缓存到一个数组中


经常使用的精灵(如主角)始终保存在内存中,而较旧的精灵会随着时间的推移卸载。通过这种方法,我不再在sprites上使用10 MB的内存,而是使用少于0.5 MB的内存。

谢谢您的回答!我在游戏中有一个类似的设置,但是我没有让所有的东西都是静态的,而是一个单例类。我真的不知道哪条路更好。我在Assets类中加载和卸载所有纹理,但我没有在Assets类中调用manager.dispose()。仅限manager.clear()。我知道这是错误的,但当我使用dispose()方法时,我的应用程序在恢复时会出错。你知道为什么会这样吗?无论如何,谢谢你的回答!dispose()处理管理器本身,因此应该改用manager.clear()。请记住,“内存中的资产”并不等于“内存泄漏”,特别是对于Java的GC策略。在hide()过程中,您确实不需要处置资产,除非其他应用程序因此出现内存问题。我对此表示怀疑。在wiki中,提到“不要使AssetManager或任何其他资源(如纹理等)处于静态状态,除非您正确管理它们”。如果我在
游戏中定义asset manager对象,并在
屏幕中调用它,不是更容易吗?