2015-03-14 4 views
2

Игра My Android (OpenGL ES 2.0) должна быть приостановлена, когда пользователь минимизирует ее, не разрушая то, что уже нарисовано на экране. Первоначально он использовал NativeActivity и чистый C++, но похоже, что это невозможно. Я переписал его, и теперь Java генерирует настраиваемый GLSurfaceView, а игровая логика + рендеринг - на C++. Я добавил setPreserveEGLContextOnPause (true), когда поверхность создана.Предотвращение уничтожения EGLContext при переходе на задний план

Так изъян после кнопки пользователь нажмет Home является:

  1. OnPause посылает nativeOnPause в код C++ через JNI
  2. кодовые наборы
  3. C++ пауза переменную, которая предотвращает обновление и оказание

Это работает нормально. После того, как мы вернемся в приложение:

  1. onResume звонки nativeOnResume
  2. nativeOnResume вызывает методу EGL, чтобы получить текущий контекст, дисплей и поверхность и передать менеджеру игр.
  3. Обновление и визуализация активирован
  4. Мы получаем несколько EGL_BAD_SURFACE сообщения и, наконец, аварии на eglMakeCurrent

Возникает вопрос: должны ли мы каким-либо образом воссоздать EGLSurface и EGLDisplay с использованием текущего контекста, или получить текущую поверхность и дисплей в порядке?

Я также заметил, что, когда мы вернемся в приложение, onResume называется, но onSurfaceChanged или onSurfaceCreated не называется.

Любое предложение, как подойти к этой проблеме на> 4.0 устройствах?

ответ

2

Не используйте GLSurfaceView, если вы хотите контролировать время жизни контекста EGL.

Класс GLSurfaceView обрабатывает контекст EGL для вас и довольно агрессивен относительно отказа от него. Вызов setPreserveEGLContextOnPause(), вероятно, не будет делать то, что вы хотите. Если вы переключитесь на SurfaceView, у вас будет полный контроль над временем жизни контекста EGL, но это обоюдоострый меч, так как теперь вам необходимо полностью управлять контентом EGL.

Вы можете найти различные примеры использования GLES с SurfaceView в Grafika. Примером может служить деятельность «hardware scaler exerciser».

Эта деятельность также демонстрирует один подход к управлению жизненным циклом деятельности. Обсуждение отношений между Activity и SurfaceView, в том числе, почему вы не всегда видите surfaceChanged() и surfaceCreated(), можно найти в документе графической архитектуры in an appendix.

Сказав все это, сохраняя контекст EGL и все связанные с ним ресурсы, пока ваше приложение неактивно, является плохой практикой.Когда пользователь приостанавливает ваше приложение, эти ресурсы должны быть выпущены, чтобы в других приложениях были доступны все возможности устройства.

Смежные вопросы