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接口,便於最後資源的釋放和回收。

        

        

       

  

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