纹理未显示在应用程序中

时间:2015-03-19 01:20:03

标签: java android libgdx

在研究框架libgdx的过程中,我发现了一种构建项目的好方法。这是我加载纹理并显示它的例子。

实现AssetManager的单例模式

public class GameAsssetManager extends AssetManager {

private static GameAsssetManager instance;

public static GameAsssetManager getInstance(){
    if(null == instance)
        instance = new GameAsssetManager();

return instance;
}

public void init(){}
}

加载图片

    public class LoadScreen implements Screen{

private void loadAssets(){
    GameAsssetManager.getInstance().load("badlogic.jpg",Texture.class);
}

@Override
public void show() {
    GameAsssetManager.getInstance().init();
    loadAssets();
}

@Override
public void render(float delta) {
    //Метод update возвращает true в том случаи, если все ресурсы загружены
    if(GameAsssetManager.getInstance().update()){
        ScreenManager.getInstance().show(CustomScreen.GAME);
    }
}
...
}

并最终显示图片

public class GameScreen implements Screen {
...
@Override
public void show() {
    batch = new SpriteBatch();
    texture = GameAsssetManager.getInstance().get("badlogic.jpg");
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 1, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    batch.begin();
    batch.draw(
            texture,
            Gdx.graphics.getWidth()/2 - texture.getWidth()/2,
            Gdx.graphics.getHeight()/2 - texture.getHeight()/2
    );
    batch.end();
}
...

所以问题如下。编译应用程序时,一切正常。但是如果你关闭应用程序并重新启动已安装的应用程序,那么应该在显示纹理的地方显示黑色方块。

3 个答案:

答案 0 :(得分:1)

暂停活动后Android失去了GLContext。请参阅 http://www.badlogicgames.com/wordpress/?p=1073

答案 1 :(得分:1)

如果您定位到Android或iOS,则不应对资产使用单例(或任何静态引用)。它们会泄漏,当您离开应用程序并恢复它时,您将以损坏/空白纹理结束。

例如,在Android上,当您关闭游戏(完成托管它的活动)时,Android会保持您的应用程序处于打开状态,因此会保留静态引用。当游戏再次打开时,新的Activity将实例化以托管新的OpenGL表面。所有旧的纹理和着色器都将来自过时的表面,但您的游戏并不知道。此外,您可能已泄露所有纹理内存。

这不会发生在你关闭游戏时。类似的事情(GL上下文丢失)有时可能仅仅是从多任务处理和回来之后发生的。

答案 2 :(得分:1)

尝试为您的GameAsssetManager类实现Disposable并释放dispose()方法中的所有资源。对于我的资产经理,我也使用单身,我没有任何内存问题和其他东西。我的意思是,释放生命周期方法,如“onPause”,“onStop”,“onDestroy”。并确保在重新启动应用程序时重新加载资源。