一、为什么我们要使用AssetManager
如果你的游戏很简单,加载资源不需要很多时间,那你没必要使用AssetManager。但在其他情况下推荐使用它,因为有以下好处:
- 异步的加载很多资源,同时你可以显示加载界面。
- 一个地方储存所有资源
- 像缓存一样透明实现功能
- 资源被重复引用。假设资源A和B都依赖于资源C,那C将会在A,B释放后再释放。这说明当你加载一个资源多次时,实际上它被共享了并且只占一次内存。
二、创建AssetManager
这部分相当简单
这样建立一个标准的AssetManager,此时所有的加载器都储存在内,让我们继续看加载器是如何工作的。
三、加载资源
在加载前,AssetManager需要知道加载什么类型的资源,这个功能通过资源加载器实现。有两个变量,同步资源加载器SynchronourAssetLoader和异步资源加载器AsynchronousAssetLoader。前者加载任何资源都在渲染进程中,后者加载资源在另外一个线程中。比如说,一个Texture需要一个Pixmap,然后加载OpenGL依赖于渲染线程。下面的资源类型可以由AssetManager直接创建。
- Pixmaps 通过 PixmapLoader
- Textures 通过 TextureLoader
- BitmapFonts 通过 BitmapFontLoader
- TextureAtlases 通过 TextureAtlasLoader
- TiledAtlases 通过 TiledAtlasLoader
- TileMapRenderers 通过 TileMapRendererLoader
- Music instances 通过 MusicLoader
- Sound instances 通过 SoundLoader
manager.load("data/myfont.fnt", BitmapFont. class);
manager.load("data/mymusic.ogg", Music. class);
public void render() {
if(manager.update()) {
// 完成加载,进行跳转
}
// 显示加载信息
float progress = manager.getProgress()
... left to the reader ...
}
}
BitmapFont font = manager.get("data/myfont.fnt", BitmapFont. class);
// texture 已经可以使用
Texture tex = manager.get("data/mytexture.png", Texture. class);
}
五、释放/销毁资源
像这样:
如果这个font引用了一个你之前手动加载的纹理,那这个纹理不会被销毁。它被多次引用,一个来自bitmap font,还有个是它自己本身。只要引用数不等于0,这个纹理就不会被销毁。
被AssetManager管理的资源不能通过手动销毁来代替AssetManager#unload()。
如果你想马上处理所有的资源可以使用
或者
两者都会销毁所有当前加载的资源,并且清空队列和没有加载完成的资源。而且,AssetManager#dispose()方法会销毁AssetManager本身。所以,不能再重新使用AssetManager。