【问题标题】:Texture is not displayed in the application纹理不显示在应用程序中
【发布时间】:2015-03-19 01:20:02
【问题描述】:

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

实现 AssetManager 的 Singleton 模式

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();
}
...

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

【问题讨论】:

  • 你有什么错误吗?
  • @Fahim 没有错误。如果在纹理之前添加 = GameAsssetManager.getInstance().get("badlogic.jpg");下一个纹理 = 新纹理(Gdx.files.internal(“src/11.jpg”));绘制了第一张图片。即 11.jpg

标签: java android libgdx


【解决方案1】:

尝试在你的 GameAsssetManager 类中实现 Disposable 并在 dispose() 方法中释放所有资源。对于我的资产管理器,我也使用单例,并且没有任何内存问题和其他问题。我的意思是,在“onPause”、“onStop”、“onDestroy”等生命周期方法中发布。并确保在再次启动应用程序时重新加载资源。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您的目标是 Android 或 iOS,则不应为您的资产使用单例(或任何静态引用)。它们会泄漏,当您离开应用程序并恢复时,您最终会看到损坏/空白的纹理。

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

      这不仅仅发生在您关闭游戏时。类似的事情(GL 上下文丢失)有时可能仅因多任务处理而发生,然后又回来。

      【讨论】:

        猜你喜欢
        • 2017-08-26
        • 1970-01-01
        • 2014-07-10
        • 2015-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多