AssetManager的使用
小游戏,资源没这么多,可以无需使用AssetManager,但要用的话,AssetManager有它的优势:
1.独立的一个地方管理资源
2.可以控制同步或者异步加载
3.提供FileHandleResolver,自定义各种类型资源的加载
步骤一:load各种资源
manager.load("data/mytexture.png", Texture.class); manager.load("data/myfont.fnt", BitmapFont.class); manager.load("data/mymusic.ogg", Music.class);
步骤二:update
以上manager还没真正的加载资源,加载资源有两个方法,update(),finishLoading()
update()是异步的,不堵塞,返回当前加载完了没有,可以用来绘制loading界面
public void render() { if(manager.update()) { // we are done loading, let's move to another screen! } // display loading information float progress = manager.getProgress() ... left to the reader ... }getProgress()方法是返回已经加载了前面load的个数,如果要load4个,只会返回0,0.25,0.5,1,以此类推
finishLoading()在render Thread里运行,是堵塞的,可以用来load急需的资源,比如绘制loading界面的资源。
步骤三:get
manager.get("data/mytexture.png", Texture.class)
步骤四:销毁
manager管理的资源不能手动的dispose,因为可能被其他的资源引用,可以用
manager.unload("data/myfont.fnt");或者manager.clear() or manager.dispose(),后者连manager本身都销毁了,后面不能继续调用其方法
问题一:Texture.setAssetManager(AssetManager manager),使用后白屏?
当来电、按Home键,失去Context的时候,资源需要加载,libgdx自动管理texture的reload
Texture里有个static的AssetManager,如果AssetManager==null的话,所有texture会在render thread 里reload()
如果setAssetManager设置了,那么由AssetManager管理的这些texture会异步加载。而且得onResume()跟AssetManager.update()配合使用,达到回来之后loading的效果。如果不update,回来就白屏了