0

我有一个不/不能使用“加载屏幕”的游戏。AssetManager在广告展示或 IAP 过程发生后,我在使用动态加载资产时遇到了一些问题- 基本上每当 OpenGL 上下文发生变化时。

我已经关注了AssetManager上的 wiki 文章,但每当我尝试加载“新”纹理时,我仍然会看到黑色纹理。

我有一个Singleton自定义GameAssetManager,它有一些方便的方法委托给 LibGDX 的AssetManager.

例如:

public Texture getTexture(String filename) {
    if (assets.isLoaded(filename)) {
        return assets.get(filename, Texture.class);
    } else {
        assets.load(filename, Texture.class);
        assets.finishLoadingAsset(filename);
        Texture texture = assets.get(filename, Texture.class);
        sessionAssets.put(filename, texture);
        return texture;
    }
}

在我的AndroidLauncher中,我像这样覆盖该onResume方法:

@Override
protected void onResume() {
    super.onResume();
    GameAssetManager.instance.resume();
}

GameAssetManager.resume()方法只是这样做:

public void resume() {
    assets = new AssetManager();
    Texture.setAssetManager(assets);
}

当通过 Google 的 IAB 库或广告展示购买商品时,我有一个StoreItemButtonwhich is a并且会更改它的布局/用户界面组件。Group

在广告展示后,或AndroidLauncher.onResume调用 IAB 进程完成后,当按钮更改它的 UI 时,它或它的一部分会变成黑色。

如果我通过并预加载所有可能的布局 - 每个按钮最多 4 个(最多 30 个按钮),然后根据情况显示/隐藏它们,它似乎工作,但这是很多开销和错误无缘无故的容易。

在这里的任何帮助将不胜感激。

4

1 回答 1

0

简短的解释是,虽然您的应用程序可能会将 JVM 堆上的纹理引用视为有效,但 GPU 中的实际纹理字节可能是无效的。

这通常发生在暂停时,因为另一个活动或进程可能会使用 OpenGL 上下文来绘制自己,并且您的程序已放入 GPU 的所有内容都可能会被丢弃。当程序在此之后恢复时(onResume),保存纹理的变量可能不会被破坏,并且可能仍然指向有效的 JVM 堆对象(因为您有静态引用,或者因为 Gargabe 收集器没有声明任何东西),但是纹理在 GPU 中消失了,应该再次推送/重新加载。

这是可以给你更完整答案的文章,直接由libgdx“仁慈的独裁者”:)

http://www.badlogicgames.com/wordpress/?p=1073

于 2016-12-02T17:39:31.317 回答