
Фреймворк Android предлагает множество API для рендеринга графики в 2D и 3D, которые взаимодействуют с реализациями графических драйверов от производителей, поэтому важно хорошо понимать, как эти API работают на более высоком уровне. На этой странице представлен уровень абстракции графического оборудования (HAL), на котором построены эти драйверы. Прежде чем продолжить, ознакомьтесь со следующими терминами:
Canvas (элемент API)Surface . Класс Canvas имеет методы для стандартного компьютерного рисования растровых изображений, линий, кругов, прямоугольников, текста и так далее, и привязан к растровому изображению или поверхности. Холст — это самый простой и лёгкий способ рисовать двумерные объекты на экране. Базовый класс — Canvas .android.graphics.drawable . Для получения дополнительной информации о Drawable и других ресурсах см. Обзор ресурсов приложения .android.opengl и javax.microedition.khronos.opengles предоставляют доступ к функциональности OpenGL ES.Surface (элемент API)Surface . Используйте класс SurfaceView вместо прямого использования класса Surface .SurfaceView (элемент API)View , который инкапсулирует объект Surface для отрисовки и предоставляет методы для динамического задания его размера и формата. SurfaceView позволяет отрисовывать ресурсоемкие операции, такие как игры или предварительный просмотр камеры, независимо от потока пользовательского интерфейса, но при этом использует дополнительную память. SurfaceView поддерживает как графику Canvas, так и графику OpenGL ES. Базовым классом для объекта SurfaceView является SurfaceView .R.style и начинающихся с Theme_ .View (элемент API)View является базовым классом для большинства компонентов компоновки экрана активности или диалогового окна, таких как текстовые поля и окна. Объект View получает вызовы от своего родительского объекта (см. ViewGroup ) для отрисовки и сообщает родительскому объекту о своем предпочтительном размере и местоположении, которые могут не учитываться родительским объектом. Для получения дополнительной информации см. View .ViewGroup (элемент API)android.widget , но наследуют класс ViewGroup .android.widget .Window (элемент API)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 может работать в трех различных режимах:
Для выполнения большей части этой работы SurfaceFlinger выступает в роли еще одного клиента OpenGL ES. Поэтому, когда SurfaceFlinger активно объединяет один или два буфера в третий, например, он использует OpenGL ES.
HAL-интерфейс Hardware Composer выполняет вторую половину работы. Этот HAL-интерфейс выступает в качестве центрального звена для всей графической отрисовки в Android.
,
Фреймворк Android предлагает множество API для рендеринга графики в 2D и 3D, которые взаимодействуют с реализациями графических драйверов от производителей, поэтому важно хорошо понимать, как эти API работают на более высоком уровне. На этой странице представлен уровень абстракции графического оборудования (HAL), на котором построены эти драйверы. Прежде чем продолжить, ознакомьтесь со следующими терминами:
Canvas (элемент API)Surface . Класс Canvas имеет методы для стандартного компьютерного рисования растровых изображений, линий, кругов, прямоугольников, текста и так далее, и привязан к растровому изображению или поверхности. Холст — это самый простой и лёгкий способ рисовать двумерные объекты на экране. Базовый класс — Canvas .android.graphics.drawable . Для получения дополнительной информации о Drawable и других ресурсах см. Обзор ресурсов приложения .android.opengl и javax.microedition.khronos.opengles предоставляют доступ к функциональности OpenGL ES.Surface (элемент API)Surface . Используйте класс SurfaceView вместо прямого использования класса Surface .SurfaceView (элемент API)View , который инкапсулирует объект Surface для отрисовки и предоставляет методы для динамического задания его размера и формата. SurfaceView позволяет отрисовывать ресурсоемкие операции, такие как игры или предварительный просмотр камеры, независимо от потока пользовательского интерфейса, но при этом использует дополнительную память. SurfaceView поддерживает как графику Canvas, так и графику OpenGL ES. Базовым классом для объекта SurfaceView является SurfaceView .R.style и начинающихся с Theme_ .View (элемент API)View является базовым классом для большинства компонентов компоновки экрана активности или диалогового окна, таких как текстовые поля и окна. Объект View получает вызовы от своего родительского объекта (см. ViewGroup ) для отрисовки и сообщает родительскому объекту о своем предпочтительном размере и местоположении, которые могут не учитываться родительским объектом. Для получения дополнительной информации см. View .ViewGroup (элемент API)android.widget , но наследуют класс ViewGroup .android.widget .Window (элемент API)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 может работать в трех различных режимах:
Для выполнения большей части этой работы SurfaceFlinger выступает в роли еще одного клиента OpenGL ES. Поэтому, когда SurfaceFlinger активно объединяет один или два буфера в третий, например, он использует OpenGL ES.
HAL-интерфейс Hardware Composer выполняет вторую половину работы. Этот HAL-интерфейс выступает в качестве центрального звена для всей графической отрисовки в Android.