Android活动失去GL上下文

时间:2014-06-17 14:43:36

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

我花了几天时间阅读并实现了各种解决方案,到目前为止绝对没有一个能够解决问题,所以我现在认为我在这里遇到了不同的问题。

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

这使用NDK进行OpenGL绘图。

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

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

如果我启动应用程序而不是旋转/离开它,一切都很好,我有一个很好的3D图形引擎,我已移植到Android,它工作得非常出色,直到设备旋转,根据人们的上下文简直丢失

我的本​​机代码所做的是调用GLES 2.0函数,不进行任何上下文创建,不做任何特殊操作,如果我想将函数移动到Android的Java端在onDrawFrame()中我仍然有这个问题。

我试过了:   - 将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

所以它肯定是一个背景问题。

我把头发拉过来。

1 个答案:

答案 0 :(得分:0)

从我在代码中看到的内容,当应用程序暂停时,您正在破坏上下文。 请参阅renderer.Destroy()

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

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

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