从待机/睡眠状态返回时无法创建EGL表面

时间:2011-04-21 15:21:32

标签: android opengl-es android-ndk

我试图让我的android 2.3 NativeActivity在从睡眠模式返回时成功恢复。 这是使用OpenGL的纯粹原生活动。

我在清单中使用了android:configChanges =“orientation”,以避免在进入睡眠时被摧毁。

当我收到APP_CMD_TERM_WINDOW时,我会卸载我的GL资源并终止GL。

当我从睡眠模式返回时尝试初始化GL时出现问题。 当我得到APP_CMD_INIT_WINDOW,并像往常一样尝试初始化GL时,我无法创建新的表面。

eglCreateWindowSurface返回EGL_BAD_MATCH,它的游戏结束......

有什么想法?

1 个答案:

答案 0 :(得分:5)

我发现大多数使用NativeActivity(NVIDIA,索尼爱立信)的EGL示例源代码,使用或不使用native-app-glue库,都有这个问题。

问题在于,在某些设备中,从睡眠模式返回后接收APP_CMD_INIT_WINDOW时获得的窗口与初始化时的窗口不同。我在示例代码中看到的大多数EGL初始化都使用硬编码属性数组调用eglChooseConfig(通常适用于该制造商的旗舰设备)。

您应该使用ANativeWindow_getFormat检查窗口的格式,并在NativeWindow具有WINDOW_FORMAT_RGB_565时仅选择565 EGL配置,在其他情况下使用888配置。

您可以使用两个属性数组,或者更好的是,您可以从eglChooseConfig获取所有配置,使用eglGetConfigAttrib获取值(深度,模板等)并寻找具有您的值的确切值想。它可能没有您指定的深度尺寸或模板尺寸,但是对于具有更大模板或深度缓冲的配置,您应该没问题。