Я пишу применение Android, которое использует OpenGL ES (GLSurfaceView и GLSurfaceView. Renderer). Проблема состоит в том, что, когда пользователь переключает заявления и затем переключается назад на мое приложение, GLSurfaceView разрушает и воссоздает контекст ГК. Это - то, что это, как предполагается, делает согласно документации, но является там способом предотвратить это?
Требуется много времени, чтобы загрузить структуры в контекст, и я хотел бы предотвратить необходимость перезагрузить их.
Думаю, то, что вы ищете, обсуждается в документации 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 при паузе без необходимости его воссоздания. Однако есть несколько предостережений:
Используя некоторое отражение API для проверки возможностей, можно будет использовать эту функцию на поддерживающих устройствах. Однако вам все равно придется вернуться к воссозданию контекста для остальных. На мой взгляд, до тех пор, пока на Android 3 не будет работать больше устройств, лучше воздержаться от использования setPreserveEGLContextOnPause
и сосредоточиться на обеспечении достаточного тестирования подхода контекстного воссоздания.
Прошло много времени с тех пор, как я работал с OpenGL, и это была стандартная сортировка на настольных ПК, но я, кажется, помню, что стандартный OpenGL не требует перезагрузки текстур при переключении контекста. Конечно, в данном случае это не очень помогает.
Если предположить, что текстуры необходимо перезагрузить, возникает вопрос: как это ускорить? И тогда возникает вопрос, сколько текстур вам нужно одновременно и можете ли вы загружать их по запросу? Каковы их размеры? Я помню, что степень двойки обычно загружалась быстрее, хотя это также может зависеть от реализации OpenGL и драйверов.
Я также слышал о хранении контекста там, где он не будет разрушен, примерно как в этой ветке: Проблема переключения представления opengles