В чем смысл класса EGL14

Я работаю над Android с OpenGL. Я grep код GLSurfaceView, и я замечаю, что он использует класс EGL10 для работы с Opengl.

Прогуливаясь по javadoc платформы Android, я замечаю, что есть еще один интересный класс EGL14, с почти такими же методами и константами EGL10.

Итак … в чем разница между EGL10 и EGL14?

Это просто разные версии EGL, который является оконным системным интерфейсом OpenGL, используемым на Android.

  • EGL10 соответствует EGL 1.0, который является спецификацией, выпущенной в 2003 году.
  • EGL14 соответствует EGL 1.4 , который является спецификацией, выпущенной в 2014 году.

Это означает, что EGL14 намного более свежий. Последняя спецификация – EGL 1.5, выпущенная в 2015 году.

Несчастливый аспект заключается в том, что привязки Java Java для этих двух версий совершенно разные. Хотя функционально EGL 1.4 является надмножеством EGL 1.0 (по крайней мере, AFAIK, я не сравнивал спецификации систематически), EGL14 в Android не является расширенной версией API EGL10 . Таким образом, вы не можете просто смешивать и сопоставлять функциональность между ними. Вы в значительной степени должны выбрать один и придерживаться его.

Излишне говорить, что, основываясь на 11-летней разнице в времени выпуска, EGL 1.4 значительно превосходит EGL 1.0.

Теперь вы можете удивиться, почему GLSurfaceView использует ссылки EGL10 в своем интерфейсе. Я не знаю точно, но я сильно подозреваю, что это для обратной совместимости. EGL14 был добавлен только на уровне API 17, а GLSurfaceView был там с уровня API 3. Чтобы не ломать старые приложения, им почти пришлось бы представить отличную версию GLSurfaceView которая связана с EGL14 .

Если вы хотите использовать GLSurfaceView и EGL14 вместе, вам нужно перепрыгнуть через несколько обручей. Например, если у вас есть объект EGLConfig из интерфейса EGL10 и нужен соответствующий объект EGLConfig для использования с интерфейсом EGL14 , единственный способ, который я нашел, – извлечь идентификатор конфигурации из исходной конфигурации, используя версию eglGetConfigAttrib() , А затем запросить конфигурацию EGL14 используя версию eglChooseConfig() .

Что добавляет к «забаве», когда вы начинаете смешивать две версии, так это то, что они в основном используют одни и те же имена методов. Это означает, что вы должны использовать квалифицированные имена в исходных файлах, где имеете дело с обеими версиями.