Документация Android гласит:
Есть ситуации, когда контекст рендеринга EGL будет потерян. Обычно это происходит, когда устройство просыпается после сна. Когда контекст EGL потерян, все ресурсы OpenGL (например, текстуры), связанные с этим контекстом, будут автоматически удалены. Для правильного рендеринга рендерер должен воссоздать все потерянные ресурсы, которые ему все еще нужны. Метод onSurfaceCreated (GL10, EGLConfig) является удобным местом для этого.
Но необходимость перезагрузить все текстуры в контексте OpenGL - это и боль, и ухудшает игровой процесс для пользователя при повторном входе в приложение после паузы. Я знаю, что «Angry Birds» как-то избегает этого, я ищу предложения о том, как сделать то же самое?
Я работаю с Android NDK r5 (версия CrystaX.) Я нашел это возможное решение проблемы, но я стараюсь избегать создания полной версии SDK.
Ответы:
Остров Реплики имеет модифицированную версию GLSurfaceView, которая решает эту проблему (и работает с более ранними версиями Android). По словам Криса Прюетта :
Редактировать: я только что понял, что вы уже опубликовали ссылку на аналогичный взломать. Я не думаю, что есть какое-либо встроенное решение до соты. Replica Island - популярная игра, работающая на многих устройствах, и вам может помочь реализация Криса и комментарии.
источник
Я хотел бы добавить еще один ответ на этот вопрос, который был передан мне год или два назад Крисом Пруиттом (Остров Реплик, Рыцарь Ветра и т. Д.). Это особенно полезно здесь в 2013 году, поскольку setPreserveEglContextOnPause (true), похоже, не работает на 4.3. (Я могу ошибаться в этом, но именно так это выглядит сейчас, когда я обновляю код игры, последний раз затронутый в 2011 году).
По сути, дело в том, чтобы отсоединить ваш GLSurfaceView от иерархии представления от onPause () вашей активности. Так как он не находится в иерархии представления в момент запуска onPause (), контекст никогда не разрушается.
Таким образом, onPause () вашей Активности должен выглядеть так:
И вы восстанавливаете свой GLSurfaceView в иерархию не из onResume (), а из onWindowFocusChanged ():
Обратите внимание, что вы никогда не вызываете функции GLSurfaceView onPause () и onResume () и что это официальный SDK GLSurfaceView, взломанная альтернативная версия не требуется.
источник
<rant> Я потратил огромное количество времени на эту проблему, я пробовал много разных решений, и ни одно не работало до сегодняшнего дня, я думаю, что это одно из самых ужасных дизайнерских решений, которое я когда-либо видел, но из команды Android я не действительно удивлен </ rant>
Таким образом, решение состоит в том, чтобы переместить элемент eglContext вверх и сделать его статическим (глобальным), чтобы он не был уничтожен, тогда вам просто нужно проверить, является ли он нулевым или нет, прежде чем создавать его снова.
Пока что это решение, похоже, работает для нас, и нам все равно, будет ли оно работать на устройствах 2005 года.
источник
Используйте сотовый API. Есть опция сохранить ваш OGL-контекст. В противном случае вам необходимо перезагрузить контекст. Это не сложно и не больно.
Нужно понимать, что есть два случая (Android 2.1):
Примечание: старые андроид gpus не поддерживают мультиконтекст. Таким образом, контекст opengl теряется, когда вы переключаетесь на другое приложение => нет доступного решения (вы можете взломать, чтобы сохранить ваш контекст при паузе на экране).
Примечание 2: функция HoneyComb установлена в PreREGEGLContextOnPause
источник
Некоторые из ответов здесь разумны для раннего использования OpenGL ES на Android. Первые устройства GLES поддерживали только один контекст, поэтому GLSurfaceView был разработан для агрессивного сброса состояния. Убедить GLSurfaceView сделать иначе непросто.
Для более поздних версий Android (возможно, использующих GLES 2.x) лучшим решением будет использование простого SurfaceView и собственное управление EGL и потоками. Вы можете найти множество примеров GLES используются с простым SurfaceView в GRAFIKA , включая библиотеку простых классов для создания и уничтожения EGL контексты.
Хорошей практикой по-прежнему является выгрузка состояния, когда приложение переходит в фоновый режим, но для примера от Криса Пруетта - где приложение все еще находилось на переднем плане, но действие, в котором размещен GLSurfaceView, было отключено - разрывать смысла нет вниз по контексту.
источник