我花了几天时间阅读并实现了各种解决方案,到目前为止绝对没有一个能够解决问题,所以我现在认为我在这里遇到了不同的问题。
当我的设备(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
所以它肯定是一个背景问题。
我把头发拉过来。
答案 0 :(得分:0)
从我在代码中看到的内容,当应用程序暂停时,您正在破坏上下文。 请参阅renderer.Destroy()
@Override
public void onPause() {
super.onPause();
if (renderer != null) {
glSurfaceView.onPause();
renderer.Destroy(); // Deconstruct the native objects + gl textures
}
}
我会尝试删除该调用,否则glSurfaceView将引用一个被销毁的渲染器。