在NativeActivity恢复时重新初始化OpenGL ES 2窗口

3
解决了!请看下面的更新。
我们正在将一个大型的C++应用程序移植到Android,当暂停和恢复应用程序时,一切都运行得很好。我们监听APP_CMD_INIT_WINDOW命令,当它出现时,我们重新初始化所有的egl命令,以获取表面、上下文和显示器。这一点之后屏幕就变黑了。但是,如果我们设置了glClearColor,那么它就可以像应该的那样工作,这意味着我们至少有了窗口,可以对其进行绘制。这让我们相信可能还有其他东西没有被重新初始化。
我的问题是,在恢复(或暂停)后是否需要清除和重新加载缓冲区、着色器程序或其他缓存的内容,并且是否有适当的测试方法。我们怀疑这可能与我们的应用程序使用旧的EGL Context引用旧的缓冲区有关,但我们无从得知。该应用程序使用了大量的纹理和离屏缓冲区。
更新:像往常一样,在尝试了不同的东西一个星期后,我们在创建帖子后终于解决了问题。以下是解决方案:
所有缓存的纹理、缓冲区和着色器都与由EGL创建的上下文句柄相关联。有几件事情需要初始化以创建GL上下文,窗口表面是其中之一。这是唯一一个依赖于ANativeWindow对象的东西,在暂停和恢复应用程序时会被销毁和重新创建。因此,这是唯一需要重新创建的内容。
简而言之:
在恢复时使用新的窗口对象作为参数再次运行eglCreateWindowSurface。

不要通过更新问题并附上答案的方式来解答问题,而是应该直接回答问题。自我解答也是可以的。这样做可以避免问题在列表中显示为未解答的状态。 - haffax
谢谢你的提示。它说我不能在8小时内回答自己的问题,所以我想确保没有人浪费时间回答它。 - Jake
啊,好的,我不知道有时间限制。 - haffax
2个回答

4
所有缓存的纹理、缓冲区和着色器都与由EGL创建的上下文句柄连接。有几件事情需要初始化以创建GL上下文,窗口表面就是其中之一。这是唯一一个依赖于ANativeWindow对象的初始化项,在暂停和恢复应用程序时会被销毁和重新创建。因此,这是唯一需要重新创建的初始化项。
简而言之:
在恢复时使用新的窗口对象作为参数再次运行eglCreateWindowSurface。

0

我必须同时调用eglCreateWindowSurface和eglMakeCurrent,同时重复使用其他所有内容,这样它就可以工作了(android 4.2)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接