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