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, поэтому вы можете привести одно к другому.