Графика

Значок Android Graphics HAL

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

холст (общий термин), Canvas (элемент API)
Холст — это поверхность для рисования, которая обрабатывает композицию фактических битов на растровом изображении или объекте Surface . Класс Canvas имеет методы для стандартного компьютерного рисования растровых изображений, линий, кругов, прямоугольников, текста и так далее, и привязан к растровому изображению или поверхности. Холст — это самый простой и лёгкий способ рисовать двумерные объекты на экране. Базовый класс — Canvas .
рисуемый
Drawable — это скомпилированный визуальный ресурс, который можно использовать в качестве фона, заголовка или другой части экрана. Drawable обычно загружается в другой элемент пользовательского интерфейса, например, в качестве фонового изображения. Drawable не может получать события, но назначает различные другие свойства, такие как состояние и планирование, чтобы обеспечить работу подклассов, таких как объекты анимации или библиотеки изображений. Многие объекты Drawable загружаются из файлов ресурсов Drawable — XML-файлов или файлов растровых изображений, описывающих изображение. Ресурсы Drawable компилируются в подклассы android.graphics.drawable . Для получения дополнительной информации о Drawable и других ресурсах см. Обзор ресурсов приложения .
ресурс макета
Ресурс макета — это XML-файл, описывающий структуру экрана действия. Дополнительную информацию см. в разделе «Ресурс макета» .
девятипатч (9-patch, NinePatch)
«Девятипатч» — это изменяемый по размеру растровый ресурс, который можно использовать в качестве фона или других изображений на устройстве. Для получения дополнительной информации см. «Девятипатч» .
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 (общий термин), SurfaceView (элемент API)
Объект SurfaceView — это объект View , который инкапсулирует объект Surface для отрисовки и предоставляет методы для динамического задания его размера и формата. SurfaceView позволяет отрисовывать ресурсоемкие операции, такие как игры или предварительный просмотр камеры, независимо от потока пользовательского интерфейса, но при этом использует дополнительную память. SurfaceView поддерживает как графику Canvas, так и графику OpenGL ES. Базовым классом для объекта SurfaceView является SurfaceView .
тема
Тема — это набор свойств, таких как размер текста и цвет фона, объединенных для определения различных настроек отображения по умолчанию. Android предоставляет несколько стандартных тем, перечисленных в R.style и начинающихся с Theme_ .
представление (общий термин), View (элемент API)
Объект View отображает прямоугольную область на экране и обрабатывает щелчки мыши, нажатия клавиш и другие события взаимодействия. Класс View является базовым классом для большинства компонентов компоновки экрана активности или диалогового окна, таких как текстовые поля и окна. Объект View получает вызовы от своего родительского объекта (см. ViewGroup ) для отрисовки и сообщает родительскому объекту о своем предпочтительном размере и местоположении, которые могут не учитываться родительским объектом. Для получения дополнительной информации см. View .
группа представлений (общий термин), ViewGroup (элемент API)
Группа представлений объединяет набор дочерних представлений. Группа представлений отвечает за определение местоположения и размера дочерних представлений, а также за вызов отрисовки каждого из них при необходимости. Некоторые группы представлений невидимы и предназначены только для компоновки, в то время как другие имеют встроенный пользовательский интерфейс, например, прокручиваемый список. Группы представлений находятся в пакете android.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 и аппаратный композитор (HWC) для компоновки группы поверхностей.

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

Композитор аппаратного обеспечения

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

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

Грэллок

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

Поток данных

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

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

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

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

BufferQueue

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

Следующая диаграмма иллюстрирует процесс взаимодействия в буферной очереди:

Процесс обмена данными между буферной очередью

Рисунок 3. Процесс обмена данными между буферной очередью.

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

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

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

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

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

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

, Значок Android Graphics HAL

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

холст (общий термин), Canvas (элемент API)
Холст — это поверхность для рисования, которая обрабатывает композицию фактических битов на растровом изображении или объекте Surface . Класс Canvas имеет методы для стандартного компьютерного рисования растровых изображений, линий, кругов, прямоугольников, текста и так далее, и привязан к растровому изображению или поверхности. Холст — это самый простой и лёгкий способ рисовать двумерные объекты на экране. Базовый класс — Canvas .
рисуемый
Drawable — это скомпилированный визуальный ресурс, который можно использовать в качестве фона, заголовка или другой части экрана. Drawable обычно загружается в другой элемент пользовательского интерфейса, например, в качестве фонового изображения. Drawable не может получать события, но назначает различные другие свойства, такие как состояние и планирование, чтобы обеспечить работу подклассов, таких как объекты анимации или библиотеки изображений. Многие объекты Drawable загружаются из файлов ресурсов Drawable — XML-файлов или файлов растровых изображений, описывающих изображение. Ресурсы Drawable компилируются в подклассы android.graphics.drawable . Для получения дополнительной информации о Drawable и других ресурсах см. Обзор ресурсов приложения .
ресурс макета
Ресурс макета — это XML-файл, описывающий структуру экрана действия. Дополнительную информацию см. в разделе «Ресурс макета» .
девятипатч (9-patch, NinePatch)
«Девятипатч» — это изменяемый по размеру растровый ресурс, который можно использовать в качестве фона или других изображений на устройстве. Для получения дополнительной информации см. «Девятипатч» .
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 (общий термин), SurfaceView (элемент API)
Объект SurfaceView — это объект View , который инкапсулирует объект Surface для отрисовки и предоставляет методы для динамического задания его размера и формата. SurfaceView позволяет отрисовывать ресурсоемкие операции, такие как игры или предварительный просмотр камеры, независимо от потока пользовательского интерфейса, но при этом использует дополнительную память. SurfaceView поддерживает как графику Canvas, так и графику OpenGL ES. Базовым классом для объекта SurfaceView является SurfaceView .
тема
Тема — это набор свойств, таких как размер текста и цвет фона, объединенных для определения различных настроек отображения по умолчанию. Android предоставляет несколько стандартных тем, перечисленных в R.style и начинающихся с Theme_ .
представление (общий термин), View (элемент API)
Объект View отображает прямоугольную область на экране и обрабатывает щелчки мыши, нажатия клавиш и другие события взаимодействия. Класс View является базовым классом для большинства компонентов компоновки экрана активности или диалогового окна, таких как текстовые поля и окна. Объект View получает вызовы от своего родительского объекта (см. ViewGroup ) для отрисовки и сообщает родительскому объекту о своем предпочтительном размере и местоположении, которые могут не учитываться родительским объектом. Для получения дополнительной информации см. View .
группа представлений (общий термин), ViewGroup (элемент API)
Группа представлений объединяет набор дочерних представлений. Группа представлений отвечает за определение местоположения и размера дочерних представлений, а также за вызов отрисовки каждого из них при необходимости. Некоторые группы представлений невидимы и предназначены только для компоновки, в то время как другие имеют встроенный пользовательский интерфейс, например, прокручиваемый список. Группы представлений находятся в пакете android.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 и аппаратный композитор (HWC) для компоновки группы поверхностей.

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

Композитор аппаратного обеспечения

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

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

Грэллок

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

Поток данных

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

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

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

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

BufferQueue

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

Следующая диаграмма иллюстрирует процесс взаимодействия в буферной очереди:

Процесс обмена данными между буферной очередью

Рисунок 3. Процесс обмена данными между буферной очередью.

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

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

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

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

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

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