Как правильно инициализировать и завершить EGL на Android - PullRequest
14 голосов
/ 16 июня 2011

Несмотря на то, что существует множество примеров использования 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.

«Правильный» способ должен обеспечить:

  1. инициализацию EGL при запуске любого первого компонента, использующего EGL
  2. Завершение EGL, когда последний компонент, использующий EGL, завершен
  3. Многопоточность.Не должно быть ограничений на манипулирование EGL только из основного потока приложения.

Обратите внимание, что (2) необходимо минимизировать использование системных ресурсов приложением, когда нет активных объектов, использующих EGL/ OpenGL ES.

Есть идеи?Или, может быть, я что-то упустил из-за EGL на Android?

Обновление

Есть еще одна интересная проблема:

Из-за того, что разрешен только один активный контекст рендерингадля каждого потока, только один компонент может одновременно использовать OpenGL ES из основного потока.Наличие более одного Компонента, использующего OpenGL ES в главном потоке, работающем одновременно, приведет к проблемам, потому что последний компонент, вызывающий eglMakeCurrent () , будет неявно "заменять" контексты всех других Компонентов своим собственным (иэто фактически полностью сломало логику компонентов).

Обновление 2 (окончательное)

Было обнаружено (благодаря Romain Guy ), что в Android на самом деле есть внутреннее решение проблемы инициализации / завершения EGL в форме явного(это противоречит спецификации EGL и не упоминается в документации Android) "подсчет ссылок" внутри eglInitialize () и eglTerminate () .

1 Ответ

14 голосов
/ 17 июля 2011

eglTerminate () и eglInitialize () являются счетчиками ссылок, поэтому для каждого «компонента» можно вызывать их. В частности, на Android 3.0 очень часто встречается несколько контекстов OpenGL в одном приложении, и с EGL проблем не возникает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...