android游戏开发框架libgdx的使用(十八)—资源加载管理AssetManager的使用

一、为什么我们要使用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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值