EGLSurfaces и OpenGL ES

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

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

EGLПоверхности

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

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

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

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

EGL - это не другой аспект поверхности (например, SurfaceHolder). EGLSurface - это связанное, но независимое понятие. Вы можете рисовать на поверхности EGLSurface, которая не поддерживается поверхностью, и вы можете использовать поверхность без EGL. EGLSurface просто предоставляет GLES место для рисования.

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

ANativeWindow

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

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