time 
设为首页】【收藏本站
当前位置: 主页 > 电脑网络 > 操作系统 > 嵌入式 > Android > 【Android游戏引擎libgdx】加载资源AssetManager的使用示例

【Android游戏引擎libgdx】加载资源AssetManager的使用示例

时间:2013-01-14 23:40 点击:4288次 字体:[ ]




一、为什么我们要使用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()中:
  1. public MyAppListener implements ApplicationListener { 
  2.   
  3.    public void render() { 
  4.       if(manager.update()) { 
  5.          // 完成加载,进行跳转 
  6.       } 
  7.   
  8.       // 显示加载信息 
  9.       float progress = manager.getProgress() 
  10.       ... left to the reader ... 
  11.    } 

只要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。

 

 

 



本文地址 : http://www.fengfly.com/plus/view-211436-1.html
标签: Android 游戏引擎 libgdx AssetManager 使用示例 加载资源
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:
本栏分类