2016-11-20 126 views
0

你好我有一個來自libGDX的AssetsManager的問題。LibGDX:AssetsManager GdxRuntime拋出時出現的異常

我打開一個TTFSkinAssetsManager並添加TTFSkin。然後當我處置AssetsManager它拋出一個異常。

我知道這個問題應該是皮膚和asssets管理器會配置相同的pixmap。但是有沒有辦法阻止這種情況發生?

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: Pixmap already disposed! 
at com.badlogic.gdx.graphics.Pixmap.dispose(Pixmap.java:315) 
at com.badlogic.gdx.graphics.g2d.PixmapPacker$Page$1.dispose(PixmapPacker.java:384) 

代碼:

FreeTypeFontLoaderParameter ttfParam = new FreeTypeFontLoaderParameter(); 
    ttfParam.fontFileName = Const.TTF_ARIAL_PATH; 

    if (!manager.isLoaded(Const.TTF_ARIAL_SMALL, BitmapFont.class)) { 
     ttfParam.fontParameters.size = 16; 

     manager.load(Const.TTF_ARIAL_SMALL, BitmapFont.class, ttfParam); 
    } 

    if (!manager.isLoaded(Const.TTF_ARIAL_NORMAL, BitmapFont.class)) { 
     ttfParam.fontParameters.size = 32; 

     manager.load(Const.TTF_ARIAL_NORMAL, BitmapFont.class, ttfParam); 
    } 

    if (!manager.isLoaded(Const.TTF_ARIAL_LARGE, BitmapFont.class)) { 
     ttfParam.fontParameters.size = 64; 

     manager.load(Const.TTF_ARIAL_LARGE, BitmapFont.class, ttfParam); 
    } 

    if (!manager.isLoaded(Const.EDITOR_UI_SKIN, Skin.class)) { 
     SkinParameter skinParam = new SkinParameter(Const.EDITOR_UI_SKIN_PATH); 
     manager.load(Const.EDITOR_UI_SKIN, Skin.class, skinParam); 
    } 

    manager.finishLoading(); 

    skin = manager.get(Const.EDITOR_UI_SKIN, Skin.class); 

    BitmapFont font = manager.get(Const.TTF_ARIAL_SMALL, BitmapFont.class); 
    skin.add(Const.TTF_ARIAL_SMALL, font, BitmapFont.class); 

編輯:我解決它。但我不喜歡這個解決方案。

public void dispose() { 
    skin.remove(Const.TTF_ARIAL_SMALL, BitmapFont.class); 
    manager.dispose(); 
} 

回答

0

一旦資產不再需要,你想釋放它,以避免內存泄漏。用途:

manager.unload(yourAsset) ; 

有趣的是,如果你想釋放所有資產,不管 是否排隊或裝載,一次完成,而不是由一個做一個指出:

manager.clear() ; 

然而,通過使用clear()方法,AssetManager仍然活着,最後:

manager.dispose