Android: Когда разрушен контекст OpenGL?

В GLSurfaceView документация GLSurfaceView гласит следующее:

GLSurfaceView должен быть уведомлен, когда действие приостановлено и возобновлено. Клиенты GLSurfaceView должны вызывать onPause (), когда действие приостанавливается и onResume (), когда активность возобновляется. Эти вызовы позволяют GLSurfaceView приостанавливать и возобновлять поток рендеринга, а также разрешать GLSurfaceView выпускать и воссоздавать отображение OpenGL.

Поэтому я должен сделать что-то подобное в своей деятельности:

 public void onPause() { myGlSurfaceView.onPause(); } public void onResume() { myGlSurfaceView.onResume(); } 

Я наблюдаю в своем коде, что, если я не вызываю onPause() и onResume() тогда контекст не теряется, когда я onResume() кнопку «домой», поэтому я могу переключаться между приложениями, а затем вернуться к своей игре, и все за работой. Я вижу, что если я закрою игру с помощью кнопки «Назад», тогда экран станет черным, когда я его снова открою, но я могу изменить поведение кнопки «Назад», чтобы полностью закрыть игру и избежать этой проблемы.

Поэтому мой вопрос: когда разрушен контекст OpenGL ? Если я не вызываю onPause() и onResume() могу ли я предположить, что он никогда не будет уничтожен?

РЕДАКТИРОВАТЬ:

Я setPreserveEGLContextOnPause() на Android 2.2, поэтому setPreserveEGLContextOnPause() для меня не вариант.

Solutions Collecting From Web of "Android: Когда разрушен контекст OpenGL?"

OpenGL может быть потерян только после вызова Actvity :: onPause () и только в этом случае. См. Документацию setPreserveEGLContextOnPause :

Является ли контекст EGL фактически сохраненным или нет, зависит от того, поддерживает ли устройство Android, на котором работает программа, любое произвольное количество контекстов EGL или нет. Устройства, которые могут поддерживать только ограниченное количество контекстов EGL, должны освобождать контекст EGL, чтобы позволить нескольким приложениям делиться графическим процессором. […] контекст EGL [может быть] выпущен, когда GLSurfaceView приостановлен и воссоздается, когда GLSurfaceView возобновляется.

EDIT: Ситуация, описанная в документации, действительна для всех версий Android. Не важно, что у вас есть доступ к setPreserveEGLContextOnPause

На мой взгляд, это один из главных недостатков внедрения Android OGLES: вы не можете быть уверены.

Сама документация является неопределенной (примечание, связанное с контентом EGL):

Бывают ситуации, когда контекст рендеринга EGL будет потерян. Обычно это происходит, когда устройство просыпается после сна.

Я заметил то же поведение, что и вы о кнопке «Домой» и «Назад». Звонки – это не совсем те же самые (но не помню точно).

Единственный способ убедиться, что контекст OpenGL доступен, – создать все ресурсы OpenGL в onSurfaceCreated

Обратите внимание на setPreserveEGLContextOnPause . Еще раз, этот комментарий к документации демонстрирует «случайное» поведение разрушения контекста:

Если установлено значение true, контекст EGL может быть сохранен, когда GLSurfaceView приостановлен. […]

SetPreserveEGLContextOnPause – это вариант для вас, вам просто нужно реализовать GlSurfaceView самостоятельно.

См. Мой ответ здесь, на аналогичный вопрос: Предотвратите onPause из разбиения контекста OpenGL