Android Activity losing GL Context

Android Activity losing GL Context

本文关键字:Context GL losing Activity Android      更新时间:2023-10-16

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

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

这个使用NDK来做OpenGL绘图。

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

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

如果我启动应用程序而不旋转/离开它,一切都很好,我有一个很好的3D图像引擎,我已经移植到Android,它工作得很好,直到设备旋转,根据人们的情况,只是失去了上下文。

我的本地代码所做的是调用gles2.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

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

我都快把头发扯掉了

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

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

我将尝试删除该调用,因为否则glSurfaceView将有一个引用到渲染器被销毁