正确处理LibGDX AssetManager

时间:2014-04-12 17:50:35

标签: libgdx

所以我在LibGDX中制作游戏,我使用AssetManager来加载我的所有资产。 我只是不确定使用它的正确方法。

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

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

所以我想知道这两种方法中哪一种是最好的方法,或者是否有 一个更好的方法来解决这个问题?

由于

1 个答案:

答案 0 :(得分:7)

首先:如果您在Android上进行开发,每次用户接听电话或切换到其他应用时,都会调用hide()。这意味着您必须在show()中重新分配资源。对于像RPG这样的资源密集型游戏,这可能会导致一个恼人的黑屏,而游戏正在重新分配图形等。不好玩。

第二次要尽早优化游戏。如果您遇到Out of of Memory错误,那么您忘记处理的一些菜单图形可能不是瓶颈。

有了这些观点,我发现实现资产加载器的最简单方法是拥有一个单独的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(),然后继续游戏。< / p>

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

即可

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

经常使用的精灵(例如主角)总是保存在内存中,而较旧的精灵会随着时间的推移而被卸载。使用这种方法,而不是在sprite上使用10 MB的内存,我现在使用的不到0.5 MB。