【问题标题】:Android Activity losing GL ContextAndroid Activity 丢失 GL 上下文
【发布时间】:2014-06-17 14:43:36
【问题描述】:

我花了几天时间阅读并实施了各种解决方案,但到目前为止,它们都没有奏效,所以我现在想我这里有一个不同的问题。

当我的设备 (Nexus 4) 旋转或我在返回之前离开应用程序时,屏幕会变为我的 GL 视图的清晰颜色。

这使用 NDK 进行 OpenGL 绘图。

我有一个类,MainActivity(Pastebin 相当大): http://pastebin.com/ZP2hhxpA

(我确实按照一些解决方案的建议重新创建了 GLSurfaceView 类,但没有解决问题)

如果我启动应用程序并且不旋转/离开它,一切都很好,我有一个很好的 3D 图形引擎,我已经移植到 Android 并且它运行良好,直到设备旋转,根据人们的说法,上下文完全丢失了.

我的本​​机代码所做的是调用 GLES 2.0 函数,不做任何上下文创建,不做任何特别的事情,如果我愿意,我可以在 onDrawFrame() 中将函数移动到 Android 的 Java 端,我仍然有这个问题。

我尝试过: - 将 GLSurfaceView 设置为在暂停时不丢失上下文(不改变任何内容) - 将 GLSurfaceView 重新创建为一个新类(没有任何改变) - 禁用旋转(不是一个有效的解决方案,暂停时问题仍然存在)

很多人说解决方案是加载纹理并在 onSurfaceCreated() 方法中创建着色器,这正是我正在做的。这不是纹理未加载的情况,当使用没有纹理的着色器时屏幕仍然变白,就好像我的对象消失了一样。

我无法弄清楚如何手动保留上下文,我没有找到任何示例代码,虽然这个问题众所周知并记录在案,但用于实际解决方案的代码似乎很少。

我注意到一条警告消息,当旋转设备时,Nexus 4 GPU 驱动程序会在每次屏幕旋转时在 glDrawArrays() 调用中报告这两个错误(每次重新启动应用时发生更改):

<core_glHint:84>: GL_INVALID_ENUM
<gl_draw_error_checks:575>: GL_INVALID_OPERATION

这使我假设我的顶点数组对当前上下文无效,但是我可以保证顶点数组在活动中的 onSurfaceCreated() 调用上被销毁和重建。

在旋转/暂停后每隔一段时间在 Nexus 7 上会出现错误:

call to OpenGL ES API with no current context

所以这肯定是上下文问题。

我正在为此而烦恼。

【问题讨论】:

  • 您是否在活动和GLSurfaceView 之间连接了onPause()onResume()
  • 我已将代码粘贴到设置了这些方法的粘贴箱中,它们肯定会在正确的时间被调用。
  • GLSurfaceView 在应用暂停时显式销毁上下文。您可以尝试使用 developer.android.com/reference/android/opengl/… 覆盖它,但通常更容易将所有内容删除并在暂停/恢复时将其恢复。
  • 拆掉它并把它带回来是我已经在做的事情,我仍然收到关于缺少上下文的 GL 错误。我发现如果我在创建过程中添加 1 秒的延迟,我可以可靠地完美地重新创建所有内容,而没有延迟我会遇到上下文问题。奇怪的是这个应用程序没有多线程。

标签: java android c++ opengl-es android-ndk


【解决方案1】:

从我在您的代码中可以看到,当应用暂停时,您正在破坏上下文。 参考renderer.Destroy()

@Override
public void onPause() {
    super.onPause();

    if (renderer != null) {
        glSurfaceView.onPause();
        renderer.Destroy(); // Deconstruct the native objects + gl textures
    }
}

我会尝试删除该调用,否则 glSurfaceView 将引用已销毁的渲染器。

【讨论】:

  • renderer.Destroy() 是我自己处理 NDK 关闭的方法,它不涉及上下文
  • 看您的评论,您的资源将被破坏。所以你会使用无效或没有资源
  • OpenGL资源被破坏了,我不应该这样做吗?我的印象是 GL 句柄不会在上下文之间转移
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多