【发布时间】: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