Google is committed to advancing racial equity for Black communities. See how.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

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, поэтому вы можете преобразовывать одно в другое.