Графическая архитектура

Что каждый разработчик должен знать о поверхностях, SurfaceHolder, EGLSurface, SurfaceView, GLSurfaceView, SurfaceTexture, TextureView, SurfaceFlinger и Vulkan.

На этой странице описываются основные элементы графической архитектуры на уровне системы Android и то, как они используются платформой приложения и мультимедийной системой. Основное внимание уделяется тому, как буферы графических данных перемещаются по системе. Если вы когда-нибудь задумывались, почему SurfaceView и TextureView ведут себя так, а не иначе, или как взаимодействуют поверхности и EGLSurface, вы попали по адресу.

Предполагается некоторое знакомство с устройствами Android и разработкой приложений. Вам не нужны подробные знания о структуре приложения, и упоминается очень мало вызовов API, но материал не пересекается с другой общедоступной документацией. Цель состоит в том, чтобы предоставить сведения о важных событиях, связанных с отрисовкой кадра для вывода, чтобы помочь вам сделать осознанный выбор при разработке приложения. Для этого мы работаем снизу вверх, описывая, как работают классы пользовательского интерфейса, а не как их можно использовать.

Этот раздел включает в себя несколько страниц, охватывающих все: от справочных материалов до деталей HAL и вариантов использования. Он начинается с объяснения графических буферов Android, описывает механизм композиции и отображения, а затем переходит к механизмам более высокого уровня, которые предоставляют компоновщику данные. Мы рекомендуем читать страницы в порядке, указанном ниже, а не переходить к теме, которая кажется интересной.

Компоненты низкого уровня

  • BufferQueue и gralloc . BufferQueue соединяет то, что генерирует буферы графических данных ( производитель ), с тем, что принимает данные для отображения или дальнейшей обработки ( потребитель ). Распределение буфера выполняется с помощью распределителя памяти gralloc , реализованного через интерфейс HAL, специфичный для поставщика.
  • SurfaceFlinger, Hardware Composer и виртуальные дисплеи . SurfaceFlinger принимает буферы данных из нескольких источников, объединяет их и отправляет на дисплей. Аппаратный компоновщик HAL (HWC) определяет наиболее эффективный способ объединения буферов с доступным оборудованием, а виртуальные дисплеи делают составной вывод доступным в системе (запись экрана или отправка экрана по сети).
  • Поверхность, холст и SurfaceHolder . Поверхность создает буферную очередь, которая часто используется SurfaceFlinger. При рендеринге на поверхность результат попадает в буфер, который отправляется потребителю. API-интерфейсы Canvas предоставляют программную реализацию (с поддержкой аппаратного ускорения) для рисования непосредственно на поверхности (низкоуровневая альтернатива OpenGL ES). Все, что связано с представлением, связано с SurfaceHolder, чьи API-интерфейсы позволяют получать и устанавливать параметры поверхности, такие как размер и формат.
  • EGLSurface и OpenGL ES . OpenGL ES (GLES) определяет API рендеринга графики, предназначенный для объединения с EGL , библиотекой, которая может создавать и получать доступ к окнам через операционную систему (для рисования текстурированных полигонов используйте вызовы GLES; для отображения рендеринга на экране используйте вызовы EGL). ). На этой странице также рассматривается ANativeWindow, эквивалент C/C++ класса Java Surface, используемый для создания поверхности окна EGL из машинного кода.
  • Вулкан . Vulkan — это малозатратный кроссплатформенный API для высокопроизводительной 3D-графики. Как и OpenGL ES, Vulkan предоставляет инструменты для создания высококачественной графики в реальном времени в приложениях. Преимущества Vulkan включают снижение нагрузки на ЦП и поддержку языка SPIR-V Binary Intermediate .

Компоненты высокого уровня

  • SurfaceView и GLSurfaceView . SurfaceView сочетает в себе поверхность и представление. Компоненты представления SurfaceView составляются SurfaceFlinger (а не приложением), что позволяет выполнять отрисовку из отдельного потока/процесса и изолировать от отрисовки пользовательского интерфейса приложения. GLSurfaceView предоставляет вспомогательные классы для управления контекстами EGL, взаимодействием между потоками и взаимодействием с жизненным циклом активности (но не требуется для использования GLES).
  • Текстура поверхности . SurfaceTexture объединяет поверхность и текстуру GLES для создания BufferQueue, для которого ваше приложение является потребителем. Когда производитель ставит в очередь новый буфер, он уведомляет ваше приложение, которое, в свою очередь, освобождает ранее удерживаемый буфер, получает новый буфер из очереди и делает вызовы EGL, чтобы сделать буфер доступным для GLES в качестве внешней текстуры. В Android 7.0 добавлена ​​поддержка безопасного воспроизведения видео с текстурами, что позволяет выполнять пост-обработку защищенного видеоконтента с помощью графического процессора.
  • Вид текстуры . TextureView объединяет представление с SurfaceTexture. TextureView обертывает SurfaceTexture и берет на себя ответственность за ответ на обратные вызовы и получение новых буферов. При рисовании TextureView использует содержимое последнего полученного буфера в качестве источника данных, выполняя рендеринг там, где и как указывает состояние представления. Составление представления всегда выполняется с помощью GLES, а это означает, что обновления содержимого могут также привести к перерисовке других элементов представления.