我在 LibGDX 下遇到了 OpenGL ES 上下文丢失的问题,因此我正在尝试找出解决该问题的方法。我的第一步是在扩展 Screen 的类中调用恢复函数时,实际重新初始化所有纹理。像这样:
@Override
public void resume() {
Tile.initTiles();
}
恢复功能重新创建了我的所有图 block (包括它们的纹理),所以我认为这会起作用。但是,根据文档: ApplicationListener Docs
决不应该在桌面上调用恢复函数。现在,我的 Android 手机上从未调用过resume,但在我的桌面上,我告诉程序在resume方法中将“true”打印到控制台,瞧,resume函数实际上是在桌面上调用的。
我的主要问题是:
- 为什么在我的桌面上会调用恢复函数,但在 Android 手机上却不会?
- 如何在 Android 手机的简历上重新加载纹理?目前,我的纹理在按后退键后恢复游戏时是白色的。有趣的是,通过主页按钮退出时,纹理可以很好地重新加载。
最佳答案
我将快速解释我是如何做到这一点的,对我来说,到目前为止,它在桌面和 Android 上都没有出现问题。
首先,我对所有资源使用 AssetManager
,包括 Texture
。我通常在通过加载屏幕进入实际游戏屏幕之前加载所有资源。但当您在 Screen.show()
方法中加载它们时,它也应该起作用。
每当我需要 Assets 时,检索它们的唯一方法是通过 AssetManager.get(...)
。我的 AssetManager
实际上是基本游戏类的 public static
成员,因此可以从我的代码中的任何位置访问它,并且只有一个。
在我的 Screen.resume()
方法中,我放置了一个 AssetManager.finishLoading()
,尽管我不确定这是否真的有必要。
在游戏开始并且实例化您的 AssetManager
后,我调用静态方法 Texture.setAssetManager(...)
。
这个循环就结束了。当在 Android 上您的 OGL 上下文丢失时,LibGDX 实际上会为您恢复它。由于您已经为 Textures
设置了 AssetManager
,管理器将能够在重新加载纹理后找到它们。 AssetManager.finishLoading()
将等待重新加载完成。之后,一切都应该像上下文丢失之前一样工作。
为什么 Screen.resume()
没有被调用,我不能说。对我来说,它是在 Android 上调用的。也许您需要更新 LibGDX 版本。
关于opengl-es - LibGDX 恢复功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21947002/