Графика

Значок Android Graphics HAL

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Граллок

Распределитель графической памяти (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 и потребления с помощью GL Consumer, среди прочих задач.

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

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

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

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