Несмотря на то, что существует множество примеров использования OpenGL ES на Android, все они кажутся неправильными (даже те, которые поставляются с Android SDK / NDK) в отношении инициализации / завершения EGL.И источником проблемы является только модель приложения Android, которая делает правильное использование EGL странным.
Реальная проблема, которую EGL инициализировал для процесса ОС , в то время как все образцы Android идаже GLSurfaceView (на самом деле большинство примеров просто используют его) включают инициализацию / завершение EGL для компонента (Activity или WallpaperService).И это совершенно неправильно из-за того, что все компоненты работают в одном процессе!Нет проблем, если приложение состоит только из одного компонента, но это проблема, если в приложении несколько компонентов, каждый из которых использует OpenGL ES.
Просто рассмотрим ситуацию, когда два компонента приложения используют OpenGL ES.работает одновременно, и один из них закончен.После завершения такой компонент вызовет eglTerminate () (посмотрите исходный код GLSurfaceView , чтобы увидеть, о чем я говорю), и это прекратит работу EGL для всего процесса !И любые вызовы EGL от другого уже запущенного компонента с этого момента завершатся неудачно!
Я проверил множество примеров, и все они инициализируют и завершают EGL для каждого компонента (на самом деле никто из тех, кого я видел, не делал что-то другоечем GLSurfaceView делают, большинство из них просто копии GLSurfaceView внутренностей).
А теперь мне интересно найти "правильный" способчтобы начать работать (в отношении инициализации / завершения) с EGL на Android.
«Правильный» способ должен обеспечить:
- инициализацию EGL при запуске любого первого компонента, использующего EGL
- Завершение EGL, когда последний компонент, использующий EGL, завершен
- Многопоточность.Не должно быть ограничений на манипулирование EGL только из основного потока приложения.
Обратите внимание, что (2) необходимо минимизировать использование системных ресурсов приложением, когда нет активных объектов, использующих EGL/ OpenGL ES.
Есть идеи?Или, может быть, я что-то упустил из-за EGL на Android?
Обновление
Есть еще одна интересная проблема:
Из-за того, что разрешен только один активный контекст рендерингадля каждого потока, только один компонент может одновременно использовать OpenGL ES из основного потока.Наличие более одного Компонента, использующего OpenGL ES в главном потоке, работающем одновременно, приведет к проблемам, потому что последний компонент, вызывающий eglMakeCurrent () , будет неявно "заменять" контексты всех других Компонентов своим собственным (иэто фактически полностью сломало логику компонентов).
Обновление 2 (окончательное)
Было обнаружено (благодаря Romain Guy ), что в Android на самом деле есть внутреннее решение проблемы инициализации / завершения EGL в форме явного(это противоречит спецификации EGL и не упоминается в документации Android) "подсчет ссылок" внутри eglInitialize () и eglTerminate () .