Подтвердить что ты не робот

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

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

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

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

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

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

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

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

EDIT:

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

4b9b3361

Ответ 1

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

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

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

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

Документация сама по себе является неопределенной (EGL Context Lost note):

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

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

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

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

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