Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> 【Android游戲引擎libgdx】加載資源AssetManager的使用示例

【Android游戲引擎libgdx】加載資源AssetManager的使用示例

編輯:Android開發實例

一、為什麼我們要使用AssetManager

如果你的游戲很簡單,加載資源不需要很多時間,那你沒必要使用AssetManager。但在其他情況下推薦使用它,因為有以下好處:

  • 異步的加載很多資源,同時你可以顯示加載界面。
  • 一個地方儲存所有資源
  • 像緩存一樣透明實現功能
  • 資源被重復引用。假設資源A和B都依賴於資源C,那C將會在A,B釋放後再釋放。這說明當你加載一個資源多次時,實際上它被共享了並且只占一次內存。

 

二、創建AssetManager

這部分相當簡單

AssetManager manager = new AssetManager();

這樣建立一個標准的AssetManager,此時所有的加載器都儲存在內,讓我們繼續看加載器是如何工作的。

 

三、加載資源
在加載前,AssetManager需要知道加載什麼類型的資源,這個功能通過資源加載器實現。有兩個變量,同步資源加載器SynchronourAssetLoader和異步資源加載器AsynchronousAssetLoader。前者加載任何資源都在渲染進程中,後者加載資源在另外一個線程中。比如說,一個Texture需要一個Pixmap,然後加載OpenGL依賴於渲染線程。下面的資源類型可以由AssetManager直接創建。

  • Pixmaps 通過 PixmapLoader
  • Textures 通過 TextureLoader
  • BitmapFonts 通過 BitmapFontLoader
  • TextureAtlases 通過 TextureAtlasLoader
  • TiledAtlases 通過 TiledAtlasLoader
  • TileMapRenderers 通過 TileMapRendererLoader
  • Music instances 通過 MusicLoader
  • Sound instances 通過 SoundLoader
加載某個資源很簡單:
manager.load("data/mytexture.png", Texture.class);
manager.load("data/myfont.fnt", BitmapFont.class);
manager.load("data/mymusic.ogg", Music.class);
目前為止,我們只是將資源放入加載隊列,AssetManager還沒有加載任何東西。我們必須不斷調用AssetManager#update()在ApplicationListener#render()中:
  1. public MyAppListener implements ApplicationListener { 
  2.   
  3.    public void render() { 
  4.       if(manager.update()) { 
  5.          // 完成加載,進行跳轉 
  6.       } 
  7.   
  8.       // 顯示加載信息 
  9.       float progress = manager.getProgress() 
  10.       ... left to the reader ... 
  11.    } 

只要AssetManager#update()返回false,我們就知道加載尚未完成。為了查看當前加載狀態可以使用AssetManager#getProgress(),它返回一個0到1的數,表示當前加載的完成的百分比。其他方法提供了相似的信息,比如AssetManager#getLoadedAssets()和AssetManager#getQueuedAssets()。你必須持續調用AssetManager#update()進行加載。   如果你想打斷或者確定所有資源已經加載完成,可以調用:

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 已經可以使用
Texture tex = manager.get("data/mytexture.png", Texture.class);
}

 

 五、釋放/銷毀資源

像這樣:

manager.unload("data/myfont.fnt");

如果這個font引用了一個你之前手動加載的紋理,那這個紋理不會被銷毀。它被多次引用,一個來自bitmap font,還有個是它自己本身。只要引用數不等於0,這個紋理就不會被銷毀。

被AssetManager管理的資源不能通過手動銷毀來代替AssetManager#unload()。

如果你想馬上處理所有的資源可以使用

manager.clear();

或者

manager.dispose();

兩者都會銷毀所有當前加載的資源,並且清空隊列和沒有加載完成的資源。而且,AssetManager#dispose()方法會銷毀AssetManager本身。所以,不能再重新使用AssetManager。

 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved