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

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

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

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

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


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

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

简而言之:

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

最佳答案

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

简而言之:

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

关于android - 在 NativeActivity 恢复时重新初始化 OpenGL ES 2 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10173013/

相关文章:

java - 打开抽屉导航时如何使背景 Activity 变小?

android - Android:替换 fragment 后如何停止音乐?

android - 从源代码构建 Android 时如何查看实际的 gcc 选项?

ios - `glCopyTexImage2D` 在 OpenGL ES 2.0 iPhone 6.1 上使用 `GL_RGB8_OES` 扩展

android - 对于区域设置 "ar"(阿拉伯语),还应定义以下数量 : few, 多个、两个、零

java - 在 Android 应用程序上设置头像

android - android应用程序如何使用用户制作的库?

android - NDK r10 b 32 位或 64 位或使用两者编译以及如何实现

ios - 绘制 2D 纹理而不缩放?

ios cocos2d 2.0 使用什么代替 glNormalPointer