正确处理LibGDX AssetManager

Joh*_*han 5 libgdx

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

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

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

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

谢谢

use*_*774 7

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

第二:早期优化游戏时要小心.如果您遇到Out-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();
}
Run Code Online (Sandbox Code Playgroud)

然后,在你的加载屏幕的render()方法中,你所要做的就是调用Assets.manager.update()- 如果它返回true,则调用Assets.done()并继续你的游戏.

这种方法有一些好处.首先,它允许您将所有资产加载逻辑保留在一个类中.其次,如果您必须手动处理资源,则可以直接调用Assets.myGraphics.dispose().

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

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

  • 我对此有疑问.在wiki中,提到"不要使你的AssetManager或任何其他资源(如Texture等)静态,除非你正确管理它们".如果我在我的`Game`类中定义资产管理器对象并在整个屏幕中调用它,那会不会更容易? (5认同)