Intereting Posts
Почему LocalBroadcastManager не работал вместо Context.registerReceiver? Состояние пользовательской кнопки Android Как опубликовать файл split apk в Google Play Store Нанесение внешней тени при рисовании изображения Кинжал 2 проблемы @ Инъекция FirebaseMessagingService Как получить все события из календаря? Ошибка раздувания фрагмента в диалоге второй раз Установка ширины текста в LinearLayout Как обнаружить глазного зрачка круговым в opencv Android Game API: Leaderboard – получить конкретный счет игрока? InApp голосовое управление триггером и автономное SpeechRecognition на Android ICS Eclipse ADT 17 вызывает утечку памяти при редактировании пользовательского интерфейса макета? Общие указатели: есть ли какие-либо отличия между шаблоном «sp <>» для Android и шаблоном «shared_ptr <>» от BOOST? Как изменить собственный язык календаря на Android? Назад в кордове / phongap meteor build для android не будет закрывать приложение последовательно

Предотвратить onPause из разбиения контекста OpenGL

Я пишу приложение для Android, которое использует OpenGL ES (GLSurfaceView и GLSurfaceView.Renderer). Проблема в том, что когда пользователь переключает приложения и затем переключается обратно в мое приложение, GLSurfaceView уничтожает и воссоздает контекст GL. Это то, что он должен делать в соответствии с документацией, но есть ли способ предотвратить это?

Для загрузки текстур в контекст требуется много времени, и я бы хотел не перезагружать их.

Я думаю, что то, что вы ищете, обсуждается в документации GLSurfaceView:

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

При использовании стандартного Android SDK вы должны освобождать / воссоздавать свой контекст всякий раз, когда действие приостанавливается / возобновляется (включая изменения ориентации экрана). Это не приведет к тому, что контекст GL будет выпущен и не восстановлен, когда активность будет загружена обратно в память. Помните, что мы имеем дело с очень ограниченными ресурсами (особенно на устройствах с низкими спецификациями). Итак, короткий ответ: вы не можете предотвратить это, не нарушая ваше приложение.

Предполагая, что вы используете стандартную платформу Android / OpenGL, вам нужно сделать следующее …

В своей деятельности убедитесь, что у вас есть следующие переопределенные методы:

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

Все, что вы держите за пределами среды GL, по-прежнему необходимо сохранить и восстановить вручную (растровые изображения, состояние игры и т. Д.), Для этого вам понадобятся статические поля или механизм SharedPreferences.

Обновить

Android 3.x обеспечивает функцию сохранения контекста GL на паузе без необходимости воссоздания. Однако есть несколько оговорок:

  1. Возможности Android 3.x недоступны прибл. 90% устройств на рынке в это время
  2. Устройства также должны поддерживать несколько контекстов EGL, неясно, сколько устройств на рынке в настоящее время поддерживает это.

Используя некоторое отражение API для проверки возможностей, можно использовать эту функцию на поддерживающих устройствах. Однако вам все равно придется вернуться к воссозданию контекста для остальных. На мой взгляд, до тех пор, пока больше устройств не будет работать под управлением Android 3, лучше было бы остановиться с помощью setPreserveEGLContextOnPause и сосредоточиться на обеспечении достаточного тестирования подхода к контексту.

Как уже упоминалось в комментарии выше, также можно избежать разгрома контекста GL ранее выпусков Android (1.x, 2.x), решение состоит в том, чтобы скопировать GLSurfaceView из исходного кода SDK Android-15, изменить его имя пакета и Затем используйте свою собственную копию GlSurfaceView.

Он должен работать на устройствах, поддерживающих несколько контекстов GL (за исключением чипов Adreno на данный момент), независимо от версии Android. Предостережение в том, что GLSurfaceView от Android-15 содержит только необходимые материалы для работы с android-15, наша версия должна обрабатывать все ОС-версии.

Мы используем собственную реализацию GlSurfaceView на основе копии ReplicaIsland, где Chriss Pruit также использовал свою собственную реализацию.

В нашей версии мы добавили setPreserveEGLContextOnPause из SDK-15, что позволяет сохранить GL-контекст, например, для одного из них, использующего Android 2.3.

Мы также изменили другие вещи в соответствии с нашими потребностями, что не имеет отношения к этому вопросу (например, 32-разрядная рендеринг на поддерживающих ее телефонах, в противном случае – 16 бит).

Наш GlSurfaceView: http://pastebin.com/U4x5JjAr

Вот оригинальная версия GlSurfaceView SDK-15, отформатированная таким же (Android) стилем, что и выше http://pastebin.com/hziRmB3E (так что легко сравнивать и видеть изменения)

Не забудьте включить сохранение контекста, вызвав:

  glSurfaceView.setPreserveEGLContextOnPause(true); 

Начиная с уровня API 11, вы можете указать, должен ли быть сохранен ваш контекст.

Из документа:

Public void setPreserveEGLContextOnPause (boolean preserveOnPause) Поскольку: Уровень API 11

Контролируйте, сохраняется ли контекст EGL, когда GLSurfaceView приостановлен и возобновлен.

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

Если установлено значение false, контекст EGL будет выпущен, когда GLSurfaceView будет приостановлен и воссоздан, когда GLSurfaceView будет возобновлен.

Значение по умолчанию – false.

Параметры preserveOnPause сохраняют контекст EGL при приостановке

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

Предполагая, что текстуры должны быть перезагружены, возникает вопрос: как вы ускоряете это? И тогда возникает вопрос, сколько текстуров вам нужно в любой момент, и можете ли вы загрузить их по требованию? Каковы их размеры? Я помню, что полномочия двух обычно быстрее загружались, хотя это также может зависеть от реализации OpenGL и драйверов.

Я также слышал о сохранении контекста где-то, где он не будет уничтожен, что-то вроде этого потока: проблема переключения вида opengles