在NativeActivity上重新初始化OpenGL ES 2窗口

时间:2012-04-16 11:10:05

标签: android android-ndk opengl-es-2.0 android-ndk-r7

解决!请参阅下面的更新。

我们正在将一个大型C ++应用程序移植到Android,一切正常,直到暂停和恢复应用程序。我们监听APP_CMD_INIT_WINDOW命令,当它到来时,我们重新初始化所有egl命令以获得表面,上下文和显示。在此之后屏幕变黑。但是,如果我们设置一个glClearColor它应该工作之后,这意味着我们至少有窗口,它可以被绘制。这使我们相信可能还有其他东西没有重新初始化。

我的问题是,是否有缓冲区,着色器程序或其他缓存的东西需要在恢复之后(或暂停之前)清除和重新加载,以及合适的测试方法。我们怀疑它可能与我们的应用程序使用旧的EGL上下文引用旧缓冲区有关,但我们无从知晓。该应用程序使用大量纹理和屏幕外缓冲区。


更新:像往常一样,经过一周尝试不同的事情后,我们终于在创建帖子后解决了这个问题。这是解决方案:

所有缓存的纹理,缓冲区和着色器都连接到EGL创建的上下文句柄。初始化有几个东西来创建GL上下文,窗口表面就是其中之一。这是唯一依赖于ANativeWindow对象的对象,该对象在暂停和恢复应用程序时被销毁并重新创建。因此,这是唯一需要重新创建的。

简而言之:

使用新窗口对象作为参数,在恢复之后再次运行eglCreateWindowSurface。

2 个答案:

答案 0 :(得分:4)

所有缓存的纹理,缓冲区和着色器都连接到EGL创建的上下文句柄。初始化有几个东西来创建GL上下文,窗口表面就是其中之一。这是唯一依赖于ANativeWindow对象的对象,该对象在暂停和恢复应用程序时被销毁并重新创建。因此,这是唯一需要重新创建的。

简而言之:

使用新窗口对象作为参数,在恢复之后再次运行eglCreateWindowSurface。

答案 1 :(得分:0)

我不得不同时调用eglCreateWindowSurface和eglMakeCurrent,同时重用其他所有内容,并且它有效(android 4.2)