Препятствуйте тому, чтобы onPause громил Контекст OpenGL

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

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

21
задан cjserio 21 January 2010 в 20:47
поделиться

2 ответа

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

GLSurfaceView должен получать уведомления, когда действие приостанавливается и возобновляется. Клиенты GLSurfaceView должны {{ 1}} вызывают 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 и сосредоточиться на обеспечении достаточного тестирования подхода контекстного воссоздания.

15
ответ дан 29 November 2019 в 21:38
поделиться

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

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

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

0
ответ дан 29 November 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: