libgdx游戏引擎(六)之资源异步加载

        作为一个非常棒的游戏开发引擎,Libgdx肯定是拿来做游戏的,而游戏就有一个最大的特点,就是图片资源和音频资源都非常地庞大,越是精美的游戏,越需要强大的图形渲染来支撑。

     我们不可能直接在UI线程中去加载,因此加载问题就是一个不得不解决的问题。

      直接加载接口启动速度太慢,会有很长时间的黑屏。自己独立开一个线程加载也存在很大的问题,由于Android和java复杂的相互制约的初始化机制和垃圾回收机制,资源很可能还没有加载完成就被使用,在Libgdx中的典型症状就是纹理花屏。资源自动回收这个问题就更为复杂,系统会在内存不够的时候回收一些资源,这是我们更难掌控的。

       好在强大的libgdx引擎是专门为游戏设计的引擎,它提供了一个非常有用的工具,即为AssetManager,简单的说就是一个资源异步加载和资源自动管理类。

       在加载前,AssetManager需要知道加载什么类型的资源,这个功能通过资源加载器实现。有两个变量,同步资源加载器SynchronourAssetLoader和异步资源加载器AsynchronousAssetLoader。前者加载任何资源都在渲染进程中,后者加载资源在另外一个线程中。比如说,一个Texture需要一个Pixmap,然后加载OpenGL依赖于渲染线程。

        所谓的AssetManager异步加载是指相对于我们开发者而言的异步,因为我们主要的显示操作是在UI线程上,因此AssetManager的加载是异步的。但为什么这里又有同步加载和异步加载之分呢?这里的同步和异步是相对渲染线程而言的,简单的理解就是相对系统专门用来调用render()函数的那个线程而言的。那么这样就很简单了,所谓异步加载就是另开一个线程而不在渲染线程里面,同步就是在render()线程里加载咯...而这两种加载方式相对UI线程都是异步的。

      

下面的资源类型可以由AssetManager直接创建。
·        Pixmaps 通过 PixmapLoader
·        Textures 通过 TextureLoader
·        BitmapFonts 通过BitmapFontLoader
·        TextureAtlases 通过TextureAtlasLoader
·        TiledAtlases 通过TiledAtlasLoader
·        TileMapRenderers 通过 TileMapRendererLoader
·        Music instances 通过 MusicLoader
·        Sound instances 通过 SoundLoader


加载某个资源很简单:
manager.load("data/testin.png", Texture.class);
manager.load("data/ testin.fnt", BitmapFont.class);
         到目前为止,我们只是将资源放入加载队列,AssetManager还没有载入任何东西。我们必须不断调用AssetManager的update()才能将队列中的资源不断加载进来。

         什么地方能让我们不停调用update()方法呢?难道再新开一个线程?就是在render()函数中去不停调用update()就可以了,而且这是系统自动调用的。

         一般这种持有较多资源的类建议都继承Disposable接口,便于最后资源的释放和回收。

        

        

       

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章