Графика

Значок HAL графики Android

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

canvas (общий термин), Canvas (элемент API)
Холст – это поверхность для рисования, на которой выполняется композиция битов с растровым изображением или объектом Surface. Класс Canvas содержит методы для стандартного компьютерного рисования битовых карт, линий, кругов, прямоугольников, текста и т. д. и привязан к битовой карте или поверхности. Холст – это самый простой способ рисовать на экране двухмерные объекты. Базовый класс: Canvas.
выдвигающийся
Объект Drawable – это скомпилированный визуальный ресурс, который можно использовать в качестве фона, заголовка или другого элемента экрана. Обычно объект Drawable загружается в другой элемент пользовательского интерфейса, например в качестве фонового изображения. Объект Drawable не может получать события, но назначает различные другие свойства, такие как состояние и планирование, чтобы включить подклассы, такие как объекты анимации или библиотеки изображений. Многие прорисовываемые объекты загружаются из файлов прорисовываемых ресурсов – XML- или файлов битовых карт, в которых описано изображение. Ресурсы Drawable компилируются в подклассы android.graphics.drawable. Подробнее о графических объектах и других ресурсах рассказывается в статье Обзор ресурсов приложения.
ресурс разметки
Ресурс макета – это XML-файл, который описывает макет экрана объекта activity. Подробнее о ресурсах разметки…
nine-patch (9-patch, NinePatch)
Nine-patch – это масштабируемый растровый ресурс, который можно использовать для фонов или других изображений на устройстве. Подробнее о Nine-patch…
OpenGL ES
OpenGL ES – это кроссплатформенный API для отрисовки 2D- и 3D-графики. В Android есть библиотеки OpenGL ES для аппаратного ускорения 3D-рендеринга. Для двухмерного рендеринга проще использовать холст. OpenGL ES доступен в Android Native Development Kit (NDK). Пакеты android.opengl и javax.microedition.khronos.opengles предоставляют доступ к функциям OpenGL ES.
surface (общий термин), Surface (элемент API)
Поверхность представляет собой блок памяти, который компонуется на экране. Поверхность содержит холст для рисования и предоставляет различные вспомогательные методы для рисования слоев и изменения размера объекта Surface. Используйте класс SurfaceView вместо класса Surface.
surface view (общий термин), SurfaceView (элемент API)
Объект SurfaceView – это объект View, который содержит объект Surface для рисования и предоставляет методы для динамического указания его размера и формата. Представление SurfaceView позволяет рисовать независимо от потока UI для ресурсоемких операций, таких как игры или предварительный просмотр камеры, но при этом используется дополнительная память. Представление поверхности поддерживает графику, созданную с помощью Canvas и OpenGL ES. Базовый класс для объекта SurfaceView – SurfaceView.
тема
Тема – это набор свойств, например размер текста и цвет фона, которые определяют настройки экрана по умолчанию. В Android есть несколько стандартных тем, перечисленных в R.style и начинающихся с Theme_.
Посмотреть (общий термин), View (элемент API)
Представление рисует прямоугольную область на экране и обрабатывает клики, нажатия клавиш и другие события взаимодействия. Класс View – это базовый класс для большинства компонентов макета экрана действий или диалогового окна, например текстовых полей и окон. Объект View получает от родительского объекта (см. ViewGroup) вызовы для отрисовки и сообщает родительскому объекту о своем предпочтительном размере и местоположении, которые родительский объект может не учитывать. Подробнее View…
группа (общий термин), ViewGroup (элемент API)
Группа представлений объединяет набор дочерних представлений. Группа представлений отвечает за то, где будут размещены дочерние представления и какого размера они могут быть, а также за то, чтобы при необходимости вызывать их для отрисовки. Некоторые контейнеры ViewGroup невидимы и предназначены только для макета, тогда как другие имеют собственный интерфейс, например прокручиваемый список. Классы View Group находятся в пакете android.widget, но расширяют класс ViewGroup.
иерархия View
Иерархия представлений – это структура объектов представлений и групп представлений, которая определяет пользовательский интерфейс для каждого компонента приложения. Иерархия состоит из групп представлений, которые содержат одно или несколько дочерних представлений или групп представлений. Чтобы получить визуальное представление иерархии View для отладки и оптимизации, используйте инструмент Hierarchy Viewer, который поставляется вместе с Android SDK.
Vulkan
Vulkan – это кросс-платформенный API с низкими накладными расходами для высокопроизводительной 3D-графики.
виджет
Виджет – это один из наборов полностью реализованных подклассов представления, которые отображают элементы формы и другие компоненты пользовательского интерфейса, например текстовое поле или всплывающее меню. Поскольку виджет полностью реализован, он обрабатывает измерения, отрисовывает себя и реагирует на события экрана. Виджеты находятся в пакете android.widget.
window (общий термин), Window (элемент API)
В приложении для Android окно – это объект, производный от абстрактного класса Window, который определяет элементы общего окна, такие как внешний вид, текст строки заголовка, а также расположение и содержимое меню. В диалоговых окнах и действиях для отрисовки объекта Window используется реализация класса Window. Вам не нужно реализовывать класс Window или использовать окна в приложении.

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

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

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

На приведенной ниже диаграмме показано, как взаимодействуют основные компоненты.

компоненты для отрисовки изображений;

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

Основные компоненты описаны в следующих разделах.

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

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

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

Чаще всего потоки изображений использует SurfaceFlinger – системный сервис, который получает данные о видимых в данный момент поверхностях и объединяет их на экране, используя информацию от менеджера окон. SurfaceFlinger – единственный сервис, который может изменять контент на экране. SurfaceFlinger использует OpenGL и Hardware Composer (HWC) для создания группы поверхностей.

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

Аппаратный композитор

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

HAL композитора выполняет вторую половину работы и является центральной точкой для всех операций отрисовки графики в Android. HWC должен поддерживать события, одним из которых является VSync (другое – горячее подключение для поддержки HDMI с автоматической настройкой).

Gralloc

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

Поток данных

На схеме ниже показан графический конвейер Android.

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

Рисунок 2. Графический поток данных в Android.

Объекты слева – это отрисовщики, создающие графические буферы, например главный экран, строку состояния и системный интерфейс. SurfaceFlinger – это компоновщик, а HWC – композитор.

BufferQueue

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

На приведенной ниже схеме показан процесс обмена данными с помощью BufferQueue.

Процесс взаимодействия BufferQueue

Рисунок 3. Процесс обмена данными с BufferQueue.

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

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

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

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

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

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