Графика

Значок Android Graphics HAL

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

холст (общий термин), Canvas (элемент API)
Холст — это поверхность рисования, которая обрабатывает компоновку реальных битов с растровым изображением или объектом Surface . Canvas имеет методы для стандартного компьютерного рисования растровых изображений, линий, кругов, прямоугольников, текста и т. д. и привязан к растровому изображению или поверхности. Холст — это самый простой и легкий способ рисовать 2D-объекты на экране. Базовый класс — Canvas .
вытягиваемый
Drawable — это скомпилированный визуальный ресурс, который можно использовать в качестве фона, заголовка или другой части экрана. Рисуемый объект обычно загружается в другой элемент пользовательского интерфейса, например, в качестве фонового изображения. Drawable не может получать события, но назначает различные другие свойства, такие как состояние и планирование, для включения подклассов, таких как объекты анимации или библиотеки изображений. Многие объекты рисования загружаются из файлов ресурсов рисования — XML или растровых файлов, описывающих изображение. Ресурсы Drawable скомпилированы в подклассы android.graphics.drawable . Дополнительные сведения о чертежах и других ресурсах см. в разделе Ресурсы .
ресурс макета
Ресурс макета — это XML-файл, описывающий макет экрана активности. Дополнительные сведения см. в разделе Ресурс макета .
девять патчей (9 патчей, NinePatch)
Девять патчей — это ресурс растрового изображения с изменяемым размером, который можно использовать для фона или других изображений на устройстве. Для получения дополнительной информации см. Nine-patch .
OpenGL ES
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)
Группа представлений группирует набор дочерних представлений. Группа представлений отвечает за принятие решения о том, где расположены дочерние представления и насколько они могут быть большими, а также за вызов каждого из них для рисования себя, когда это необходимо. Некоторые группы представлений невидимы и предназначены только для макета, тогда как другие имеют встроенный пользовательский интерфейс, например поле со списком с прокруткой. Группы представлений находятся в пакете widget , но являются расширением класса ViewGroup .
просмотреть иерархию
Иерархия представлений — это расположение объектов представлений и групп представлений, которое определяет пользовательский интерфейс для каждого компонента приложения. Иерархия состоит из групп представлений, которые содержат одно или несколько дочерних представлений или групп представлений. Вы можете получить визуальное представление иерархии представлений для отладки и оптимизации с помощью средства просмотра иерархии , поставляемого с 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 для составления группы поверхностей.

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

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

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

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

Граллок

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

Поток данных

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

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

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

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

БуферОчередь

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.