#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:
После попытки:
- не вызывайте GLSurfaceView#onPause / onResume в onPause / onResume Activity
- вызовите GLSurfaceView#onPause / onResume, но также установите GLSurfaceView#setPreserveEGLContextOnPause (true)
В обоих случаях исправлена проблема с HOME-resume-black-texture. Думаю, реализации Android не удалось воссоздать контекст EGL при возобновлении. Поскольку для вызова требуются onPause / onResume, всегда следует устанавливать setPreserveEGLContextOnPause в значение true.