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

Графика

Значок Android Graphics HAL

Платформа Android предлагает множество API-интерфейсов для рендеринга графики для 2D и 3D, которые взаимодействуют с реализациями графических драйверов производителя, поэтому важно хорошо понимать, как эти API работают на более высоком уровне. На этой странице представлен уровень абстракции графического оборудования (HAL), на котором построены эти драйверы.

Разработчики приложений выводят изображения на экран тремя способами: с помощью Canvas , OpenGL ES или Vulkan .

Графические компоненты Android

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

На следующей диаграмме показано, как ключевые компоненты работают вместе:

компоненты рендеринга изображений

Рисунок 1. Как визуализируются поверхности

Основные компоненты описаны ниже:

Производители потокового изображения

Производителем потока изображений может быть все, что создает графические буферы для потребления. Примеры включают в себя видеодекодеры OpenGL ES, Canvas 2D и mediaserver.

Потребители потока изображений

Наиболее распространенным потребителем потоков изображений является SurfaceFlinger, системная служба, которая использует видимые в данный момент поверхности и объединяет их на дисплей, используя информацию, предоставленную диспетчером окон. SurfaceFlinger - единственная служба, которая может изменять содержимое дисплея. SurfaceFlinger использует OpenGL и Hardware Composer для создания группы поверхностей.

Другие приложения OpenGL ES также могут использовать потоки изображений, например приложение камеры, использующее поток изображений предварительного просмотра камеры. Приложения, не относящиеся к GL, также могут быть потребителями, например класс ImageReader.

Компоновщик оборудования

Аппаратная абстракция для подсистемы отображения. SurfaceFlinger может делегировать определенную работу по композиции Hardware Composer, чтобы разгрузить ее от OpenGL и GPU. SurfaceFlinger действует как еще один клиент OpenGL ES. Поэтому, когда SurfaceFlinger активно объединяет один или два буфера в третий, например, он использует OpenGL ES. Это делает композитинг более низким энергопотреблением, чем выполнение всех вычислений графическим процессором.

HAL Hardware Composer выполняет вторую половину работы и является центральной точкой для рендеринга всей графики Android. Hardware Composer должен поддерживать события, одно из которых - VSYNC (другое - горячее подключение для поддержки plug-and-playHDMI).

Граллок

Распределитель графической памяти (Gralloc) необходим для выделения памяти, запрошенной производителями изображений. Подробнее см. Gralloc HAL .

Поток данных

На следующей схеме изображен конвейер графики Android:

поток графических данных

Рисунок 2. Поток графических данных через Android

Объекты слева - это средства визуализации, создающие графические буферы, такие как домашний экран, строка состояния и пользовательский интерфейс системы. SurfaceFlinger - это композитор, а Hardware Composer - композитор.

BufferQueue

BufferQueues обеспечивает связь между графическими компонентами Android. Это пара очередей, которые обеспечивают постоянный цикл буферов от производителя к потребителю. Как только производители передают свои буферы, SurfaceFlinger отвечает за компоновку всего на дисплее.

См. Следующую схему для процесса связи с BufferQueue.

Коммуникационный процесс BufferQueue

Рисунок 3. Процесс связи с BufferQueue

BufferQueue содержит логику, которая связывает производителей потока изображений и потребителей потока изображений. Некоторыми примерами производителей изображений являются превью камеры, производимые играми HAL камеры или OpenGL ES. Некоторыми примерами потребителей изображений являются SurfaceFlinger или другое приложение, которое отображает поток OpenGL ES, например приложение камеры, отображающее видоискатель камеры.

BufferQueue - это структура данных, которая объединяет пул буферов с очередью и использует Binder IPC для передачи буферов между процессами. Интерфейс производителя, или то, что вы передаете кому-то, кто хочет создавать графические буферы, - это IGraphicBufferProducer (часть SurfaceTexture ). BufferQueue часто используется для рендеринга на поверхность и использования GL Consumer среди других задач.

BufferQueue может работать в трех разных режимах:

Синхронный режим - BufferQueue по умолчанию работает в синхронном режиме, в котором каждый буфер, который поступает от производителя, выходит у потребителя. В этом режиме буфер никогда не сбрасывается. И если производитель работает слишком быстро и создает буферы быстрее, чем они очищаются, он блокируется и ждет свободных буферов.

Неблокирующий режим - BufferQueue также может работать в неблокирующем режиме, когда в этих случаях он генерирует ошибку, а не ждет буфер. В этом режиме ни один буфер не сбрасывается. Это полезно для предотвращения потенциальных взаимоблокировок в прикладном программном обеспечении, которое может не понимать сложных зависимостей графической структуры.

Режим сброса - наконец, BufferQueue может быть настроен так, чтобы отбрасывать старые буферы, а не генерировать ошибки или ждать. Например, при максимально быстром выполнении визуализации GL в вид текстуры и рисования буферы должны быть удалены.

Для выполнения большей части этой работы SurfaceFlinger действует как еще один клиент OpenGL ES. Поэтому, когда SurfaceFlinger активно объединяет один или два буфера в третий, например, он использует OpenGL ES.

Вторую половину работы выполняет Hardware Composer HAL. Этот HAL выступает в качестве центральной точки для рендеринга всей графики Android.