Моя игра для Android (OpenGL ES 2.0) должна быть приостановлена, когда пользователь сворачивает ее, не уничтожая то, что уже нарисовано на экране. Изначально он использовал NativeActivity и чистый C++, но, похоже, там это невозможно. Я переписал его, и теперь Java генерирует собственный GLSurfaceView, а игровая логика + рендеринг — на C++. Я добавил setPreserveEGLContextOnPause(true) при создании поверхности.
Таким образом, ошибка после нажатия пользователем кнопки «Домой»:
- onPause отправляет nativeOnPause в код C++ через JNI.
- Код C++ устанавливает переменную паузы, которая предотвращает обновление и рендеринг
Это работает нормально. После того, как мы вернемся к приложению:
- onResume вызывает nativeOnResume
- nativeOnResume вызывает методы EGL для получения текущего контекста, отображения и отображения и передает их менеджеру игры.
- Обновление и рендеринг теперь активированы
- Мы получаем несколько сообщений EGL_BAD_SURFACE и, наконец, вылетаем на eglMakeCurrent.
Вопрос в том, должны ли мы каким-либо образом воссоздавать EGLSurface и EGLDisplay, используя текущий контекст, или получить текущую поверхность и отображение в порядке?
Я также заметил, что когда мы возвращаемся к приложению, вызывается onResume, но не вызывается onSurfaceChanged или onSurfaceCreated.
Любое предложение, как решить эту проблему на устройствах> 4.0?