3

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

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

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


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

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

简而言之:

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

4

2 回答 2

4

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

简而言之:

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

于 2012-04-24T13:16:23.430 回答
0

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

于 2014-11-09T12:45:25.667 回答