2

我在 LibGDX 下遇到了 OpenGL ES 上下文丢失的问题,所以我试图弄清楚如何解决这个问题。我的第一步是在我扩展 Screen 的类中调用 resume 函数时实际重新初始化所有纹理。像这样:

@Override
public void resume() {
    Tile.initTiles();
}

resume 函数重新创建了我所有的图块(包括它们的纹理),所以我认为这会起作用。但是,根据文档: ApplicationListener Docs

永远不要在桌面上调用 resume 函数。现在,在我的 Android 手机上从未调用过 resume,但在我的桌面上,我告诉程序在 resume 方法中将“true”打印到控制台,瞧,实际上在桌面上调用了 resume 函数。

我的主要问题是:

  • 为什么在我的桌面上会调用恢复功能,而在我的 Android 手机上却没有?
  • 如何在我的 Android 手机的简历上重新加载我的纹理?目前我的纹理在按下返回键后恢复游戏时是白色的。有趣的是,当通过主页按钮退出时,纹理会重新加载。
4

1 回答 1

3

我将快速解释我是如何做到的,对我来说,到目前为止它在桌面和 Android 上都没有问题。

首先,我将一个AssetManager用于我的所有资产,包括Texture. 我通常在通过加载屏幕进入实际游戏屏幕之前加载我的所有资产。但是,当您将它们加载到您的Screen.show()方法中时,它也应该起作用。

每当我需要资产时,我检索它们的唯一方法是通过AssetManager.get(...). MyAssetManager实际上是public static基础游戏类的成员,因此可以从我的代码中的任何位置访问它,并且只有一个。

在我的Screen.resume()方法中,我放了一个AssetManager.finishLoading(),尽管我不确定这是否真的有必要。

在游戏开始并且你AssetManager被实例化之后,我调用了静态方法Texture.setAssetManager(...)

这关闭了圆圈。当在 Android 上您的 OGL 上下文丢失时,LibGDX 实际上会为您恢复它。由于您已经AssetManager为您的 设置了Textures,因此管理器将能够在重新加载纹理后找到它们。将AssetManager.finishLoading()等到重新加载完成。之后,一切都应该像上下文丢失之前一样工作。

为什么Screen.resume()不叫,我不能说。对我来说,它是在 Android 上调用的。也许你需要更新你的 LibGDX 版本。

于 2014-02-22T07:09:55.130 回答