`
zhelong111
  • 浏览: 188295 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

libgdx中的AssetManager

 
阅读更多
http://ju.outofmemory.cn/entry/25612
http://code.google.com/p/libgdx/wiki/AssetManager

这里,作者给我们列举了使用AssetManager的几种好处

加载大部分资源使用异步的方式,这样就能在加载的同时不阻塞渲染进程
实现了引用计数,当A和B都依赖C素材的时候,C只有在A,B都销毁了才会销毁.这也意味着即使一个资源加载了很多次,在内存中也之后一份
使用一个单一的实力管理所有素材
可以实现素材的缓存
创建AssetManager的方法是

AssetManager manager = new AssetManager();

当加载素材的时候,AssetManager需要知道用哪个loader来加载这个素材.这些loader都实现了AssetLoaders里的方法,其中分为两类,SynchronourAssetLoader 和AsynchronousAssetLoader.前一种在渲染进程加载资源,后面一种在另外的进程加载资源.例如创建Pixmap 需要Texture,并且有些OpenGL素材依赖于渲染进程,下面是系统已经实现的一些资源和loader的对应关系

Pixmaps via PixmapLoader
Textures via TextureLoader
BitmapFonts via BitmapFontLoader
TextureAtlases via TextureAtlasLoader
TiledAtlases via TiledAtlasLoader
TileMapRenderers via TileMapRendererLoader
Music instances via MusicLoader
Sound instances via SoundLoader
使用方法是:

manager.load("data/mytexture.png", Texture.class);
manager.load("data/myfont.fnt", BitmapFont.class);
manager.load("data/mymusic.ogg", Music.class);
这些资源将添加入加载队列,如果需要在资源加载时使用特殊的初始化参数,可以参照下面的方法

//加载TextureParameter所使用的参数
//每种资源所传递的加载参数类型是不一样的
TextureParameter param = new TextureParameter();
param.minFilter = TextureFilter.Linear;
param.genMipMaps = true;
//load时传入就可以了
manager.load("data/mytexture.png", Texture.class, param);
目前为止,素材只是添加到了加载丢列,而不会开始加载,我们需要逐帧调用
AssetManager#update()函数

public MyAppListener implements ApplicationListener {

   public void render() {
      if(manager.update()) {
         // updata()返回true,证明所有资源加载完成
         // 可以执行对应的操作了
      }

      // 获取加载进度,这个还是比较坑爹的,之后会说明
      float progress = manager.getProgress()
      ... left to the reader ...
   }
}
如果需要强制完成所有加载,可以调用
意思是将异步加载专为同步加载
这个函数会阻塞到队列中的素材加载完成

  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 is available, let's fetch it and do do something interesting
   Texture tex = manager.get("data/mytexture.png", Texture.class);
}
销毁素材:

manager.unload("data/myfont.fnt");
销毁所有素材的方式是:

manager.clear();

//或者
//区别是dispose会把AssetManager也销毁掉
manager.dispose();
另外,我们可以自己定义文件的读取方式
例如如果素材自己加密了,我们需要解密才能读取
这时候可以实现自己的FileHandleResolver

里面就一个函数

//根据文件名,返回一个FileHandle对象
public FileHandle resolve (String fileName);
new的时候传递进去就行了

AssetManager manager = new AssetManager(new ExternalFileHandleResolver());
另外一个需要说明的是,当程序切换到后台,和有可能为了节省内存
素材会被销毁
那么程序切换到前台是需要重新加载这些资源
使用AssetManager加载的资源无需担心
但是如果不是,可以使用

Texture.setAssetManager(manager);
的方式来把这些资源让AssetManager管理
另外,可能系统提供的loader不满足我们的需要,那我们可以自己定义Loader来加载我们自己的资源
从AssetManager的源码中我们可以看到他是怎么添加Loader的:

public AssetManager (FileHandleResolver resolver) {
setLoader(BitmapFont.class, new BitmapFontLoader(resolver));
setLoader(Music.class, new MusicLoader(resolver));
setLoader(Pixmap.class, new PixmapLoader(resolver));
setLoader(Sound.class, new SoundLoader(resolver));
setLoader(TextureAtlas.class, new TextureAtlasLoader(resolver));
setLoader(Texture.class, new TextureLoader(resolver));
setLoader(Skin.class, new SkinLoader(resolver));
setLoader(TileAtlas.class, new TileAtlasLoader(resolver));
setLoader(TileMapRenderer.class, new TileMapRendererLoader(resolver));
//..........不用看的代码
}
如果需要定义自己的Loader可以参照这些Loader实现
MusicLoader 同步加载器

public class MusicLoader extends SynchronousAssetLoader<Music, MusicLoader.MusicParameter> {
public MusicLoader (FileHandleResolver resolver) {
super(resolver);
}

        //调用load时,返回需要创建的对象
@Override
public Music load (AssetManager assetManager, String fileName, MusicParameter parameter) {
return Gdx.audio.newMusic(resolve(fileName));
}

        //这里返回本素材的依赖数组
        //例如bitmapfont在配置文件外需要文字图片
        //那么可以在这里返回
@Override
public Array<AssetDescriptor> getDependencies (String fileName, MusicParameter parameter) {
return null;
}

static public class MusicParameter extends AssetLoaderParameters<Music> {
}
}
异步加载器 PixmapLoader

public class PixmapLoader extends AsynchronousAssetLoader<Pixmap, PixmapLoader.PixmapParameter> {
public PixmapLoader (FileHandleResolver resolver) {
super(resolver);
}

Pixmap pixmap;

        //非渲染进程调用函数
        //没有返回值
@Override
public void loadAsync (AssetManager manager, String fileName, PixmapParameter parameter) {
pixmap = null;
pixmap = new Pixmap(resolve(fileName));
}

        //渲染进程调用函数
        //返回需要创建的对象,返回空证明还没加载完
@Override
public Pixmap loadSync (AssetManager manager, String fileName, PixmapParameter parameter) {
return pixmap;
}
        //同样,返回依赖项
@Override
public Array<AssetDescriptor> getDependencies (String fileName, PixmapParameter parameter) {
return null;
}

static public class PixmapParameter extends AssetLoaderParameters<Pixmap> {
}
}
ok,现在吐槽AssetManager的加载进度

我如果调用AssetManager#load函数2次
那么,返回的进度只会出现0,0.5,1

也就是说 AssetManager的进度完全不考虑依赖资源,load几个,就计算几个
因此,除非资源特别多,不要指望他返回的进度是平滑的

在我看来这是很大的问题…..

点赞
libgdx
分享到:
评论

相关推荐

    Libgdx利用Assetmanager实现图片加密

    在这个特定的实例中,我们关注的是如何在Libgdx中使用AssetManager来异步加载资源,并且在加载过程中进行解密,以保护游戏资源不被轻易盗取。AssetManager是Libgdx提供的一种资源管理工具,它支持异步加载各种类型的...

    libgdx AssetManager 进度条

    LibGDX AssetManager 是一个强大的资源管理工具,用于在游戏或应用中加载和管理各种类型的游戏资源,如图像、音频、字体、纹理 Atlas 和 JSON 数据等。它支持异步加载,使得开发者可以在不阻塞主线程的情况下加载...

    libgdx 资源加载器

    资源加载器,通常指的是 libGDX 中的 `AssetManager` 类,它是 libGDX 用来管理游戏或应用中各种资源的核心组件。资源可以包括音频文件(如音乐和音效)、图像(如精灵图和纹理 atlases)、字体、XML 配置文件等。`...

    libgdx FileTest.zip FileHandler

    LibGDX的AssetManager是与FileHandler紧密相关的类,它用于管理和缓存资源,如音频、图像、字体和纹理,确保资源只加载一次,提高性能。 9. **持久化数据**: 在游戏开发中,常常需要保存玩家的进度或设置。...

    libgdx Music 音乐播放

    在LibGDX中,`Music`模块是专门用于处理音频文件,尤其是背景音乐播放的。本篇将深入探讨LibGDX中的`Music`类及其相关知识点。 一、`Music`类概述 在LibGDX中,`Music`类提供了播放、暂停、停止、调整音量等功能,...

    libGDX 1.10.0 开发包

    - **AssetManager**:资源管理器帮助加载和管理游戏中的各种资源,如音频文件、纹理、字体等,提供异步加载和缓存功能。 - **Box2D World**:在物理模拟中,World对象是所有实体和物理规则的容器,你可以创建Body、...

    libgdx小游戏 捡星星

    7. **资源管理**:libgdx的AssetManager类用于加载和管理游戏中的资源,如图片、音频、字体等,确保资源的高效使用和释放。 8. **物理模拟**:如果游戏中的星星有动态行为,例如下落,可以利用libgdx的Box2D物理...

    braingdx,:视频游戏:基于libgdx的游戏jam框架。.zip

    2. 资源管理:通过集成libgdx的AssetManager,braingdx能高效管理音频、图像、字体等资源,确保资源的正确加载和释放。 3. 快速原型开发:braingdx降低了游戏开发的入门门槛,使得开发者可以在短时间内创建出基本的...

    libgdx 小游戏 消除游戏 源码 亲测可以使用

    7. **资源管理**:游戏中的图片、音频等资源通常会被加载到内存中,LibGDX 的`AssetManager`可以帮助管理这些资源,便于加载和释放。 8. **物理引擎**:虽然这是一个消除游戏,可能不涉及复杂的物理模拟,但LibGDX...

    Libgdx开源游戏 【蚂蚁回家】libgdx实现

    5. **文件I/O**:游戏中的资源如图像、音频、数据文件等,可以通过Libgdx的FileHandle类进行读写操作,支持本地存储和Android的AssetManager。 6. **输入系统**:Libgdx提供了统一的输入处理机制,无论是键盘、鼠标...

    使用LibGDX开发一个完整游戏 教程全集

    在实际开发过程中,你还需要了解如何使用AssetManager管理资源加载和释放,以避免内存泄漏。同时,理解如何进行性能优化,如减少渲染次数、合理使用缓存和适时清理无用资源,也是非常重要的。 最后,游戏的保存和...

    libgdx游戏源码-方块填充

    LibGDX的`AssetManager`类可以方便地管理和加载资源,避免内存泄漏。 总的来说,"Klooni1010-master"项目展示了如何利用LibGDX框架开发一款具有独特玩法的休闲益智游戏。通过学习这个项目,开发者不仅可以深入了解...

    android平台libgdx 解析obj文件

    在LibGDX中解析OBJ文件,可以让我们方便地将3D模型整合到游戏中。 首先,我们需要了解LibGDX中的`com.badlogic.gdx.graphics.g3d.loaders`包,这个包提供了各种模型加载器,包括用于解析OBJ文件的`ObjLoader`类。...

    libgdx游戏

    4. **AssetManager**: 资产管理器负责加载和管理游戏中的资源,如音频、图像、字体等,确保它们在需要时能被正确加载和释放。 5. **Input**: 输入模块处理来自用户的各种输入,包括触摸、鼠标和键盘事件。 6. **...

    libgdx引擎开发的游戏

    7. **Asset Manager**: 资产管理器(AssetManager)是libgdx用来加载和管理资源的重要工具。在Cuboc中,它可能被用于加载纹理、音频文件等,确保资源的异步加载和释放,避免内存泄漏。 8. **Sound and Music**: ...

    libgdx 游戏地图的制作

    在这个主题中,我们将深入探讨如何使用LibGDX来制作游戏地图。游戏地图是任何2D游戏的核心元素,它为玩家提供了一个探索和互动的空间。LibGDX 提供了TiledMap类,使开发者能够方便地创建、加载和渲染游戏地图。 **1...

    libgdx1.6.1.rar

    在使用“libgdx1.6.1.rar”时,你需要解压文件,然后将库导入到你的项目中。如果你是Android开发者,可以通过Gradle集成;如果是Java桌面应用,可以使用Maven或Ivy等依赖管理工具。在导入库之后,你可以根据LibGDX的...

    一个基于LibGDX开发的java农场游戏

    8. **Asset Management**: LibGDX的AssetManager可以帮助管理游戏的资源,如图像、音频、字体等,确保它们在需要时被正确加载和释放。 此外,游戏的源代码可能包含了游戏逻辑的实现,如作物生长机制、动物繁殖、...

    LibGDX制作android动态壁纸

    在LibGDX中,我们通常使用`SpriteBatch`进行2D渲染,使用`ShapeRenderer`绘制几何形状,或者使用`Stage`和`Actor`进行更复杂的UI布局。对于动态壁纸,可能需要创建一个无限循环的动画,这可以通过`Animation`类来...

    libgdx 切换界面

    可以使用 LibGDX 的 `AssetManager` 来管理和异步加载资源,确保资源管理的高效性。 8. **测试与调试**:在开发过程中,利用 LibGDX 的 `TestScreen` 或自定义测试工具,可以方便地验证不同界面之间的切换逻辑,...

Global site tag (gtag.js) - Google Analytics