opengl-es - LibGDX 恢复功能

标签 opengl-es libgdx openglcontext

我在 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/

相关文章:

java - 有没有办法将上下文传递到 onDrawFrame(GL10 gl) 中?

java - 我可以在 OpenGL ES 2.0 中使用哪些版本的 GLSL?

android - 如何在 Android 上使用 OpenCL?

java - libGDX 中奇怪的 PolyBatch 定位

c++ - wglCreateContextAttribsARB 函数崩溃

c - 如何使用单个 OpenGL 上下文渲染到多个窗口?

ios - OpenGL ES 1.1 - Alpha 蒙版

android - 使用 Qualcomm SDK 的基于标记的 AR android 应用程序

java - 使用浏览器打开 URLs - RoboVM/iOS

java - 是否有 libgdx 的 3D 场景图实现?