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