Chinaunix首页 | 论坛 | 博客
  • 博客访问: 868945
  • 博文数量: 366
  • 博客积分: 10267
  • 博客等级: 上将
  • 技术积分: 4290
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 14:04
文章分类

全部博文(366)

文章存档

2012年(366)

分类: 系统运维

2012-03-30 21:11:04

一、为什么我们要使用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()进行加载。

如果你想打断或者确定所有资源已经加载完成,可以调用:
manager.finishLoading();
它会打断直到所以资源加载完成。关于异步加载有点失败,但是有时候可能需要它(比如加载界面自身需要显示的资源)。
四、获得资源
这个更简单:
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) |
给主人留下些什么吧!~~