资产管理器加载pixmap out of mem Libgdx Java

时间:2014-12-01 19:19:46

标签: java android libgdx out-of-memory

我正在创建一个libgdx游戏,它工作正常,完美地加载了所有资产等。但是我接着试图实现libgdx的Asset Manager'来添加一个活动的加载屏幕等。但是这样做之后我的游戏会需要花费很长时间才能在桌面上加载,保持黑屏,几乎崩溃,然后最终崩溃,我的资产一直收到错误或类似信息:

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: Couldn't load 
    file: data/startBackground.png
        at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:140)
        at com.badlogic.gdx.graphics.glutils.FileTextureData.prepare(FileTextureData.java:64)
        at com.badlogic.gdx.graphics.Texture.load(Texture.java:130)
        at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:121)
        at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:100)
        at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:92)
        at com.MKgames.game1.screen.MainMenuScreen.show(MainMenuScreen.java:98)
        at com.badlogic.gdx.Game.setScreen(Game.java:61)
        at com.MKgames.Game1.render(Game1.java:41)
        at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:206)
        at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)
    Caused by: java.io.IOException: couldn't load pixmap outofmem
        at com.badlogic.gdx.graphics.g2d.Gdx2DPixmap.<init>(Gdx2DPixmap.java:57)
        at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:138)
        ... 10 more

然后我尝试删除我的资产类,同样的事情不断发生。

data/startBackground.png是1920 * 1080 .png图片。

我觉得在与游戏本身相反的计算机上运行它可能会成为一个问题吗?

以下是如何在没有资产经理的情况下正常加载资产(这在我尝试实施资产管理器之前曾经工作过但现在我没有删除资产经理)

public void show() {
        Texture backgroundTexture = new Texture(Gdx.files.internal("data/startBackground.png"));
        background =  new Sprite (backgroundTexture);

}

以下是我使用资产管理器加载此资产的方法:

public class Game1 extends Game{
public void render() {
        if(Assets.update()){
            this.setScreen(new MainMenuScreen(this));
        }
    }
}

...

public class Assets {

    public static AssetManager manager = new AssetManager();

    public static void queueLoading() {
        (..)
        manager.load("data/startBackground.png",Texture.class);
        (..)
    }
    public static boolean update() {
        return manager.update();
    }
}

1 个答案:

答案 0 :(得分:1)

每帧都会调用Game1渲染方法,因此您在每个帧上创建一个新屏幕,并且屏幕在每个show调用中创建一个新的纹理实例,最终会出现内存不足。

另外,不要忘记添加

super.render();

在你的游戏类渲染方法中。否则,当前屏幕的render()不会被调用