首先:如果您在 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 的 sprite),您也可以尝试将图形数据分解为离散的块。在我的游戏中,每个精灵都有一个单独的TextureAtlas,每个TextureAtlas在加载时都会缓存到一个数组中。
经常使用的精灵,例如主角,总是保存在内存中,而较旧的精灵会随着时间的推移而被卸载。使用这种方法,我现在使用的内存不到 0.5 MB,而不是在 sprite 上使用 10 MB 内存。