EGLSurfaces и OpenGL ES

Android использует API OpenGL ES (GLES) для рендеринга графики. Для создания контекстов GLES и предоставления оконной системы для рендеринга GLES Android использует библиотеку EGL . Вызовы GLES визуализируют текстурированные многоугольники, а вызовы EGL выводят визуализацию на экраны.

Прежде чем рисовать с помощью GLES, вам необходимо создать контекст GL. В EGL это означает создание EGLContext и EGLSurface. Операции GLES применяются к текущему контексту, доступ к которому осуществляется через локальное хранилище потока, а не передается в качестве аргумента. Код рендеринга должен выполняться в текущем потоке GLES, а не в потоке пользовательского интерфейса.

ЭГЛПоверхности

EGLSurface может быть внеэкранным буфером, выделенным EGL и называемым pbuffer , или окном, выделенным операционной системой. Вызов функции eglCreateWindowSurface() создает поверхности окна EGL. eglCreateWindowSurface() принимает в качестве аргумента объект окна , который в Android является поверхностью. Поверхность — это сторона производителя BufferQueue. Потребители , которыми являются SurfaceView, SurfaceTexture, TextureView или ImageReader, создают поверхности. Когда вы вызываете eglCreateWindowSurface() , EGL создает новый объект EGLSurface и подключает его к интерфейсу производителя BufferQueue объекта окна. С этого момента рендеринг в этот EGLSurface приводит к удалению буфера из очереди, его рендерингу и постановке в очередь для использования потребителем.

EGL не обеспечивает вызовы блокировки/разблокировки. Выполните команды рисования, а затем вызовите eglSwapBuffers() , чтобы отправить текущий кадр. Имя метода происходит от традиционной замены переднего и заднего буферов, но фактическая реализация может отличаться.

С поверхностью одновременно может быть связан только один EGLSurface (к BufferQueue может быть подключен только один производитель), но если вы уничтожите EGLSurface, он отключится от BufferQueue и позволит подключиться чему-то еще.

Данный поток может переключаться между несколькими EGLSurfaces, изменяя текущий . EGLSurface должен быть текущим только в одном потоке одновременно.

EGL не является еще одним аспектом поверхности (например, SurfaceHolder). EGLSurface — родственная, но независимая концепция. Вы можете рисовать на EGLSurface, не подкрепленном поверхностью, или использовать поверхность без EGL. EGLSurface просто предоставляет GLES место для рисования.

Требования OpenGL ES и EGL см. в документе определения совместимости Android.

ANativeWindow

Класс открытой поверхности реализован на языке программирования Java. Эквивалентом в C/C++ является класс ANativeWindow, частично открытый Android NDK . Вы можете получить ANativeWindow с поверхности с помощью вызова ANativeWindow_fromSurface() . Как и его двоюродный брат на языке Java, вы можете заблокировать его, выполнить рендеринг в программном обеспечении, а также разблокировать и опубликовать. Базовый собственный тип окна — это сторона производителя BufferQueue.

Чтобы создать поверхность окна EGL из собственного кода, передайте экземпляр EGLNativeWindowType в eglCreateWindowSurface() . EGLNativeWindowType — это синоним ANativeWindow, поэтому вы можете преобразовать один тип в другой.