所以我在LibGDX中制作游戏,我使用AssetManager来加载我的所有资产。 我只是不确定使用它的正确方法。
目前我正在第一个屏幕之前加载所有游戏资产。 然后我在dispose方法中清除管理器。但这意味着我有一堆纹理 所有屏幕我都不需要等等。这会导致内存泄漏吗?
我想到的另一种方法是只加载每个屏幕所需的资产 在每个屏幕hide()方法中卸载它们。
所以我想知道这两种方法中哪一种是最好的方法,或者是否有 一个更好的方法来解决这个问题?
由于
答案 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。