Libgdx AssetManager
Libgdx AssetManager
1. 资源管理器(AssetManager)概述
资源管理器(AssetManager)主要负责统一加载和管理 纹理(Texture)、纹理图集(TextureAtlas)、位图字体(BitmapFont)、音乐(Music)、音效(Sound) 等 assets 文件夹中的资源。
2. 为什么要使用 AssetManager
如果你的游戏非常简单,加载资源不需要很多时间,那么你可以选择不使用 AssetManager,在其他任何情况下都建议使用它。使用 AssetManager 的好处如下所示:
所有资源的加载采用异步加载方式,不阻塞渲染线程,因此在加载资源时可以显示一个正在加载数据的场景(在场景中可使用进度条实时显示加载进度)。
AssetManager 对资源使用引用计数。如果 资源A 和 资源B 同时依赖于 资源C,那么 资源C 只有在 资源A 和 资源B 都被释放时才释放。这也就意味着如果同一个资源被加载多次,实际上在内存中只会存在一份实例被共享使用。
在同一个地方存储所有的资源。
可以透明地实现像缓存一样的事物。
3. 创建一个 AssetManager
创建 AssetManager 实例非常简单,直接 new 创建即可:
AssetManager manager = new AssetManager();
这里创建了一个标准的资源管理器,并同时存储所有类型的资源加载器。
注意: AssetManager 和 其他所有的资源(例如 Texture 等)的实例 不能被静态变量引用 ,除非你能够很好的管理它们。比如下面的代码将可能会引起问题:
public static AssetManager assets = new AssetManager();
这在 Android 平台将会导致问题,因为静态变量的生命周期和 LibGDX 应用的生命周期不能保证一定相同。因此你的一个 LibGDX 应用实例提供的 AssetManager 实例有可能会被下一个 LibGDX 应用实例使用,而加载过的资源却不再有效。这通常会导致黑块/缺失的纹理或错误的资源。
在 Android 平台中,甚至会导致同一时间在你的 Activity 中有多个 LibGDX 应用实例被激活,所以即使你妥善处理了生命周期方法也不要认为你是安全的!
4. 加载 assets 资源
加载资源时,资源管理器需要知道如何去加载一个明确类型的资源,这个功能通过 AssetLoader(资源加载器)来实现。AssetLoader 是一个抽象类,它有两个实现,分别是 SynchronousAssetLoader(同步资源加载器) 和 AsynchronousAssetLoader(异步资源加载器),前者在渲染线程直接加载,后者在另外的一个线程中加载。
具体资源类型的加载器定义在 com.badlogic.gdx.assets.loaders 包中,下面列出 AssetManager 默认支持加载的部分资源:
Texture
BitmapFont
TextureAtlas
Music
Sound
Pixmap
ParticleEffect
Skin
I18NBundle
…
加载一个指定类型的资源非常简单:
manager.load(“data/step.png”, Texture.class);
manager.load(“data/font.fnt”, BitmapFont.class);
manager.load(“data/music.ogg”, Music.class);
调用 load 方法会将资源的加载加入到一个待加载的队列中,然后按照 load 的顺序依次加载。
把所有需要加载的资源都添加到队列后,可以调用下面的方法实时获取加载进度:
// 返回加载进度的百分比
float percent = manager.getProgress();
5. 获取已加载的资源
根据文件名称和指定的类型获取加载后的资源实例:
Texture tex = manager.get(“data/mytexture.png”, Texture.class);
BitmapFont font = manager.get(“data/myfont.fnt”, BitmapFont.class);
资源实例必须要加载完毕之后才能获取,可以使用下面方法判读是否加载完毕:
boolean texIsLoaded = manager.isLoaded(“data/mytexture.png”);
boolean fontIsLoaded = manager.isLoaded(“data/myfont.fnt”);
也可以在资源全部 load 到队列后,调用下面的等待加载完毕的方法,方法执行完再获取资源:
// 调用这个方法将阻塞线程, 直到待加载队列中的所有资源都加载完毕
manager.finishLoading();
6. 释放资源
通过 AssetManager 加载的资源,不再需要使用到某个资源,要对资源进行释放时,通常不调用资源对象本身的 dispose() 方法进行释放,而是统一由 AssetManager 中的方法进行释放。
释放单个资源:
manager.unload(“data/myfont.fnt”);
释放所有资源(包括已加载完毕的和已在待加载队列中的):
manager.clear();
释放所有资源(包括已加载完毕的和已在待加载队列中的),并销毁资源管理器(不再需要用到资源管理器时也必须手动销毁):
manager.dispose();
7. 恢复加载场景
在 Android 平台,应用可以被暂停(paused)和恢复(resumed),在这种情况下,管理的像纹理这样的 OpenGL 资源会重新加载,恢复时可能需要一些时间。如果你想在恢复时显示一个正在加载的场景,当创建好一个 AssetManager 后可以做下面这样的设置:
Texture.setAssetManager(manager);
然后在 ApplicationListener.resume() 生命周期方法中切换到正在加载的场景,并且再一次调用 AssetManager.update() 方法直到一切恢复正常。
如果你没有做 Texture.setAssetManager(manager) 的操作,通常纹理的管理机制会发挥作用自动处理,所以你不需要担心任何事情。
8. 代码示例: AssetManager 在代码中的使用
为了方便演示不再引入资源,这里只演示前面章节中常用的两张图片(badlogic.jpg 和 logo.png,直接放到 assets 文件夹下)的加载。
package com.libgdx.test;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
/**
游戏主程序的启动入口类
*/
public class MainGame extends ApplicationAdapter {// 资源在 assets 文件夹中的相对路径
private static final String BADLOGIC = “badlogic.jpg”;
private static final String LOGO = “logo.png”;private SpriteBatch batch;
private AssetManager manager;
private Texture badlogicTexture;
private Texture logoTexture;@Override
public void create() {
batch = new SpriteBatch();// 创建资源管理器manager = new AssetManager();// 加载资源manager.load(BADLOGIC, Texture.class);manager.load(LOGO, Texture.class);// 阻塞线程, 等待资源加载完毕manager.finishLoading();// 加载完毕后获取资源实例badlogicTexture = manager.get(BADLOGIC, Texture.class);logoTexture = manager.get(LOGO, Texture.class);
}
@Override
public void render() {
// 白色清屏
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);batch.begin();batch.draw(badlogicTexture, 0, 0);batch.draw(logoTexture, 10, 300);batch.end();
}
@Override
public void dispose() {
// 当应用退出时释放资源
if (manager != null) {
/*
* 释放所有资源, 并销毁 AssetManager。
*
* 注意: 本例中的 Texture 通过 AssetManager 进行管理,
* 因此这里不需要再调用 Texture 的 dispose() 方法。
*/
manager.dispose();
}
}
}
Libgdx AssetManager相关推荐
- Libgdx New 3D API 教程之 -- 使用Libgdx加载模型
http://bbs.9ria.com/thread-221701-1-1.html 在前面的教程中,我们已经看到如何设置libgdx渲染3D场景.我们已经设置了Camera,增加了一些灯光并渲染一个 ...
- Libgdx学习笔记:分享自己写的异步加载
2019独角兽企业重金招聘Python工程师标准>>> 从需求说起: 解析xml,json文件等耗时的操作,如果放到绘制线程,或者初始化里面,会导致画面卡顿一下,让人看起来不爽,这时 ...
- libgdx 1.4.1公布
(转载自http://www.libgdx.cn/topic/4/libgdx-1-4-1%E5%8F%91%E5%B8%83) libgdx从未停止进步的脚步.10月10日.libgdx1.4.1公 ...
- 第九章 Libgdx内存管理
Android游戏开发群:290051794 Libgdx游戏开发框架交流群:261954621 游戏是使用资源较多的应用.图像和音效会占用大量的内存.此外,这些资源大部分不是通过java的垃圾回收器 ...
- 跨平台2D/3D游戏开发框架libGDX发布1.2.0更新
摘要:基于OpenGL (ES)的跨平台2D/3D游戏开发框架libGDX不仅开源免费,而且具有极为强大的兼容性和高效性,近日,libGDX发布全新1.2.0版本,除修复Bug之外,还新增了OpenG ...
- LibGDX_8.1: LibGDX 项目实战: 开发跨平台 2048 游戏
本文链接: http://blog.csdn.net/xietansheng/article/details/50188259 LibGDX 基础教程(总目录) 声明: 游戏中使用到的部分图片和音频资 ...
- [libgdx游戏开发教程]使用Libgdx进行游戏开发(10)-音乐音效不求人,程序员也可以DIY
本章音效文件都来自于公共许可: http://files.cnblogs.com/mignet/sounds.zip 在游戏中,播放背景音乐和音效是基本的功能. Libgdx提供了跨平台的声音播放功 ...
- LibGDX重建Flappy Bird——(4) 创建游戏对象
在本章,我们将为Flappy Bird项目创建一个真正的场景.该游戏场景由几个具有共同属性和功能的游戏对象组成.但是,这些对象被渲染的方式和行为却各有不同, 简单的 对象直接渲染其所分配的纹理,复 ...
- libgdx小白练手-跑酷游戏
libgdx学习的一些心得 在今年4月份时 接触了libgdx这个游戏引擎 在网上找了一些相关的资料学习后,自己尝试做了一个模仿<忍者突袭>的跑酷类游戏和一个2D动作闯关类游戏. 游戏素材 ...
最新文章
- noip模拟赛 Chtholly Nota Seniorious
- 【控制】复杂度定义及计算
- C# 泛型多种参数类型与多重约束 示例
- c语言整形除法是五舍六入吗,四舍六入五成双 - C/C++论坛 - 51CTO技术论坛_中国领先的IT技术社区...
- U-Boot提供的命令【整理】
- 将20180608141920转成date格式
- 王者荣耀语音文件下载
- CAD编辑指南2:五大CAD查看器的功能盘点
- 51单片机3-红外通信
- 李南江 html5笔记,Mr.Woo跟着李南江学习HTML5—项目总结
- 使用x264压制视频简介
- 计算机网络之网络层- IPv4编址
- 5.深度解密五:网站被百度搜索引擎降权的原因及百度算法汇总
- stm32 mbed 入门教程(一)---前期准备
- Ubuntu 18.04桌面版卸载不必要的自带软件
- 青木的书籍,--股票
- 山西省阳泉市谷歌高清卫星地图下载
- 亚马逊电商数据自动化管理接口平台JAVA SP-API接口开发(中)
- 多智能体强化学习(MARL)训练环境总结
- Flutter 入门指北(Part 2)之基础部件