EGLSurfaces и OpenGL ES

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

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

EGLSurfaces

EGLSurface может быть внеэкранным буфером, выделенным EGL, называемым pbuffer , или окном, выделенным операционной системой. Вызов функции eglCreateWindowSurface() создает поверхности окна EGL. eglCreateWindowSurface() принимает объект окна в качестве аргумента, который в Android является поверхностью. Поверхность — это сторона- производитель BufferQueue. Consumers , которыми являются 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, поэтому вы можете привести одно к другому.