一、为什么我们要使用AssetManager
如果你的游戏很简单,加载资源不需要很多时间,那你没必要使用AssetManager。但在其他情况下推荐使用它,因为有以下好处:
- 异步的加载很多资源,同时你可以显示加载界面。
- 一个地方储存所有资源
- 像缓存一样透明实现功能
- 资源被重复引用。假设资源A和B都依赖于资源C,那C将会在A,B释放后再释放。这说明当你加载一个资源多次时,实际上它被共享了并且只占一次内存。
二、创建AssetManager
这部分相当简单
AssetManager manager = new 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/mytexture.png", Texture.
class);
manager.load("data/myfont.fnt", BitmapFont.
class);
manager.load("data/mymusic.ogg", Music.
class);
目前为止,我们只是将资源放入加载队列,AssetManager还没有加载任何东西。我们必须不断调用AssetManager#update()在ApplicationListener#render()中:
public MyAppListener
implements ApplicationListener {
public void render() {
if(manager.update()) {
// 完成加载,进行跳转
}
// 显示加载信息
float progress = manager.getProgress()
... left to the reader ...
}
}
只要AssetManager#update()返回false,我们就知道加载尚未完成。为了查看当前加载状态可以使用AssetManager#getProgress(),它返回一个0到1的数,表示当前加载的完成的百分比。其他方法提供了相似的信息,比如AssetManager#getLoadedAssets()和AssetManager#getQueuedAssets()。你必须持续调用AssetManager#update()进行加载。
如果你想打断或者确定所有资源已经加载完成,可以调用:
它会打断直到所以资源加载完成。关于异步加载有点失败,但是有时候可能需要它(比如加载界面自身需要显示的资源)。
四、获得资源
这个更简单:
Texture tex = manager.get("data/mytexture.png", Texture.
class);
BitmapFont font = manager.get("data/myfont.fnt", BitmapFont.
class);
当然可以假设所有资源已经成功加载,如果你要检查某个资源是否加载成功,可以:
if(manager.isLoaded("data/mytexture.png")) {
// texture 已经可以使用
Texture tex = manager.get("data/mytexture.png", Texture.
class);
}
五、释放/销毁资源
像这样:
manager.unload("data/myfont.fnt");
如果这个font引用了一个你之前手动加载的纹理,那这个纹理不会被销毁。它被多次引用,一个来自bitmap font,还有个是它自己本身。只要引用数不等于0,这个纹理就不会被销毁。
被AssetManager管理的资源不能通过手动销毁来代替AssetManager#unload()。
如果你想马上处理所有的资源可以使用
manager.clear();
或者
manager.dispose();
两者都会销毁所有当前加载的资源,并且清空队列和没有加载完成的资源。而且,AssetManager#dispose()方法会销毁AssetManager本身。所以,不能再重新使用AssetManager。
阅读(1374) | 评论(0) | 转发(0) |