Потеря текстур OpenGL в Android после возобновления

#android #opengl-es #textures

#Android #opengl-es #Текстуры

Вопрос:

Моя игра работает корректно, за исключением случая, когда я нажимаю кнопку HOME, а затем возобновляю. Что нужно сделать, чтобы снова использовать текстуры? Я попытался вызвать onPause и onResume в GLSurfaceView (когда вызываются onPause и onResume активности).

Есть идеи, что я мог делать неправильно?

Комментарии:

1. Не могли бы вы, пожалуйста, опубликовать несколько примеров кода?

2. @BadSkillz Я не уверен, какой код имеет отношение к делу. Моя активность / просмотр и средство визуализации? Я загружаю текстуры, используя машинный код. Что нужно сделать, чтобы восстановить текстуры? Нужно ли перезагружать с диска?

Ответ №1:

Если все остальное не удается, перезагрузите текстуры:

Псевдокод

 for tex in textures:
    if glIsTexture(tex.opengl_name) == false:
        glGenTextures(1, amp;tex.opengl_name)

    glBindTexture(tex.texture_target);
    glTexImage(..., texture.image);
  

Комментарии:

1. Я пробовал это, но по какой-то причине текстовые идентификаторы, казалось, были перепутаны (например, моя текстура шрифта была применена не в том месте). Я буду упорствовать и попробую еще раз

2. Спасибо, все заработало. Недостаток сна из-за новорожденного ребенка вызвал пару ошибок. С ясной головой это работает хорошо 🙂

Ответ №2:

Даже если вы исправили свою проблему, просто чтобы дать небольшое объяснение, которое может помочь другим.

Android не гарантирует сохранение контекста OpenGL при приостановке действия.

Вы должны воссоздать все OpenGL-ресурсы при возобновлении (текстуру в вашем случае, но также VBO и т.д. И т.п.).

Начиная с API 11, вы можете любезно попросить Android сохранить контекст, но нет гарантии, что это произойдет.

Комментарии:

1. Я перезагрузил текстуры, чтобы устранить проблему. Я просто допустил ошибку, делая это 🙂

2. Как вы узнаете, действительно ли OpenGL сохранил свой контекст, чтобы избежать ненужной перезагрузки?

3. Только что узнал о getPreserveEGLContextOnPause(). Если это возвращает true, вы гарантированно сохраните контекст?

4. Жаль, что я не знал о существовании setPreserveEGLContextOnPause три года назад. Это предотвратило бы множество попаданий в рейтинг моей игры из-за того, что игрокам приходилось бы ждать прерывистой загрузки текстур во время игры, например, после рекламных звонков. Невероятно, по умолчанию это значение равно false.

Ответ №3:

После попытки:

  1. не вызывайте GLSurfaceView#onPause / onResume в onPause / onResume Activity
  2. вызовите GLSurfaceView#onPause / onResume, но также установите GLSurfaceView#setPreserveEGLContextOnPause (true)

В обоих случаях исправлена проблема с HOME-resume-black-texture. Думаю, реализации Android не удалось воссоздать контекст EGL при возобновлении. Поскольку для вызова требуются onPause / onResume, всегда следует устанавливать setPreserveEGLContextOnPause в значение true.