Начните работу с Vulkan на Android
Vulkan — основной низкоуровневый графический API для Android. Vulkan обеспечивает оптимальную производительность для игр, использующих собственный игровой движок и рендерер.
Для успешной реализации Vulkan в вашем игровом движке необходимо:
- Определите, какие устройства Android следует использовать с Vulkan
- Поймите компромиссы, связанные с поддержкой старых устройств Android.
- Добавьте Vulkan в целевую сборку Android
- Выберите компилятор шейдеров для создания SPIR-V для Vulkan
- Определить доступную версию API Vulkan во время выполнения
- Узнайте, как оптимизировать операции рендеринга Vulkan с помощью профилей Vulkan, темпа кадров и предварительного вращения.
- Выберите графические инструменты для отладки и анализа производительности
- Примечание: информацию об использовании Vulkan на Android с игровыми движками Unity или Unreal см. в разделах:
- Vulkan на Unity
- Vulkan на Unreal
Выберите минимальные характеристики устройства для Vulkan
Vulkan доступен на Android, начиная с версии 7.0 (API уровня 24). Не все устройства Android с Android 7.0 и выше поддерживают Vulkan. Вам необходимо определить, какие устройства Android с поддержкой Vulkan поддерживает ваша игра.
Рекомендации
Используйте следующие характеристики в качестве минимальных требований для поддержки Vulkan:
- Устройство работает под управлением Android 10.0 (уровень API 29) или выше.
- Устройство поддерживает Vulkan API версии 1.1 или выше.
- Устройство имеет аппаратные возможности и функции, совместимые с базовым профилем Android 2022 года.
Поддержка старых устройств
Если ваша игра предназначена для запуска на широком спектре устройств с различными уровнями графических возможностей, вам может потребоваться поддержка устройств старше тех, что рекомендованы в разделе Выбор минимальных характеристик устройств для Vulkan . Перед созданием поддержки старых устройств оцените, дает ли Vulkan преимущества вашей игре. Игры с большим количеством вызовов отрисовки, использующие OpenGL ES, могут столкнуться со значительной нагрузкой на драйвер из-за высокой стоимости выполнения вызовов отрисовки в OpenGL ES. Эти игры могут стать ограниченными по ресурсам процессора, поскольку значительная часть времени кадра тратится на графический драйвер. Игры также могут значительно снизить нагрузку на процессор и энергопотребление, переключившись с OpenGL ES на Vulkan. Это особенно актуально, если в вашей игре есть сложные сцены, которые не могут эффективно использовать инстансинг для уменьшения количества вызовов отрисовки. При выборе старых устройств включите поддержку рендеринга OpenGL ES в качестве запасного варианта, так как некоторые устройства в вашем списке целевых устройств могут иметь реализации Vulkan, которые не смогут надежно запускать вашу игру.
Возможно, вы не захотите поддерживать старые устройства с поддержкой Vulkan из-за их недостаточной производительности и функциональности или проблем со стабильностью.
Производительность и характеристики
Старые устройства Android с поддержкой Vulkan могут не обладать достаточной производительностью рендеринга или аппаратной поддержкой функций, необходимых для запуска вашей игры. Это особенно вероятно, если ваша игра использует высококачественную графику, а Vulkan — единственный API, на который вы ориентируетесь в Android. Многие старые устройства ограничены версией Vulkan API 1.0.3 и часто не имеют широко распространённых расширений Vulkan, доступных на более современном оборудовании.
Стабильность
На старых устройствах Android могут использоваться устаревшие драйверы Vulkan. Эти версии драйверов могут содержать ошибки, влияющие на стабильность игры. Устранение ошибок драйверов может потребовать значительного времени на тестирование и разработку.
Добавьте Vulkan в свой проект
Чтобы добавить Vulkan в свой проект, вам необходимо:
- Включить заголовки API Vulkan
- Компиляция кода шейдера в SPIR-V
- Вызов API Vulkan во время выполнения
Включить заголовки API Vulkan
Для компиляции кода, использующего Vulkan, вашей игре необходимо включить заголовочные файлы API Vulkan. Копию заголовочных файлов Vulkan можно найти в Android NDK или в составе релизов Vulkan SDK . Любая конкретная версия NDK включает только заголовочные файлы Vulkan, доступные на момент выпуска NDK. Если вы используете заголовочные файлы Vulkan из NDK, используйте NDK версии 25 или выше, которая включает заголовочные файлы, поддерживающие Vulkan версии 1.3. Vulkan SDK содержит самую актуальную версию заголовочных файлов.
Компиляция кода шейдера в SPIR-V
API Vulkan ожидает, что шейдерные программы будут предоставлены в двоичном промежуточном формате SPIR-V. Это соглашение отличается от OpenGL ES, где исходный код, написанный на языке шейдеров OpenGL (GLSL), можно представить в виде текстовых строк. Используйте компилятор шейдеров, чтобы взять код, написанный на языке шейдеров, например, GLSL или HLSL, и скомпилировать его в модули SPIR-V для использования с Vulkan.
Компилятор shaderc можно использовать для компиляции шейдерных программ, написанных на GLSL, в SPIR-V. Если ваша игра использует HLSL, DirectXShaderCompiler поддерживает вывод SPIR-V. Обычно шейдерные программы компилируются автономно в процессе сборки ресурсов игры, а модули SPIR-V включаются в состав ресурсов среды выполнения.
Вызов API Vulkan во время выполнения
Для вызова API Vulkan вашей игре необходимо получить указатели на функции, соответствующие вызовам API Vulkan. Самый простой способ сделать это — подключиться к общей библиотеке libvulkan.so
, входящей в состав Android NDK. Подключение к библиотеке имеет два недостатка: дополнительные накладные расходы на диспетчеризацию функций и ограничения на автоматическое разрешение указателей на функции API Vulkan.
При вызове функции API Vulkan управление проходит через таблицу диспетчеризации, управляемую конструкцией, называемой загрузчиком Vulkan. Android использует собственную реализацию загрузчика Vulkan , а не загрузчик LunarG. Эта система загрузчиков является частью архитектуры слоёв API Vulkan. Подключение к системной библиотеке во время сборки приводит к появлению дополнительного уровня диспетчеризации для данного вызова API. Хотя накладные расходы невелики, они могут быть заметны в играх, выполняющих большое количество вызовов Vulkan.
Системная библиотека обычно разрешает указатели только на функции Vulkan, которые считаются частью основного API. Vulkan имеет множество расширений, определяющих дополнительные функции Vulkan, многие из которых не разрешаются системной библиотекой автоматически. Перед использованием указателей на эти функции Vulkan необходимо вручную разрешить их.
Чтобы смягчить эти проблемы, динамически разрешайте указатели на все функции Vulkan, которые вы планируете использовать во время выполнения. Один из способов добиться этого — использовать библиотеку метазагрузчика с открытым исходным кодом, например volk . В примере игры AGDKTunnel volk интегрирован для этой цели. Если вы используете библиотеку метазагрузчика, не подключайте общую библиотеку libvulkan.so
в скриптах сборки.
Определить доступную версию API Vulkan
Android поддерживает следующие версии API Vulkan:
- 1.0.3
- 1.1
- 1.3
Самый высокий номер версии API Vulkan, доступный на данном устройстве, определяется версией Android и поддержкой драйверов Vulkan.
Android-версия
Поддержка платформы для версии API Vulkan зависит от минимальной версии Android (уровня API):
- 1.3 — Android 13.0 (уровень API 33) и выше
- 1.1 — Android 10.0 (уровень API 29) и выше
- 1.0.3 — Android 7.0 (API уровня 24) и выше
Поддержка драйверов Vulkan
Поддержка версии API Vulkan на платформе Android не гарантирует, что эта версия API поддерживается драйвером Vulkan устройства. Устройство под управлением Android 13 может поддерживать только версию API Vulkan 1.1.
При инициализации Vulkan не запрашивайте версию API выше, чем:
- Максимальная версия API Vulkan для версии Android, работающей на устройстве
- Версия API Vulkan, сообщаемая vkEnumerateInstanceVersion
- Версия API Vulkan, сообщаемая свойством
apiVersion
структуры VkPhysicalDeviceProperties .
Ниже приведен пример определения максимальной поддерживаемой версии API Vulkan:
// Minimum Android API levels for Vulkan 1.3/1.1 version support
static constexpr int kMinimum_vk13_api_level = 33;
static constexpr int kMinimum_vk11_api_level = 29;
uint32_t GetHighestSupportedVulkanVersion(VkPhysicalDevice physical_device) {
uint32_t instance_api_version = 0;
vkEnumerateInstanceVersion(&instance_api_version);
VkPhysicalDeviceProperties device_properties;
vkGetPhysicalDeviceProperties(physical_device, &device_properties);
// Instance and device versions don't have to match, use the lowest version
// number for API support if they don't.
const uint32_t driver_api_version =
(instance_api_version < device_properties.apiVersion) ?
instance_api_version : device_properties.apiVersion;
const int device_api_level = android_get_device_api_level();
if (device_api_level >= kMinimum_vk13_api_level &&
driver_api_version >= VK_API_VERSION_1_3) {
return VK_API_VERSION_1_3;
} else if (device_api_level >= kMinimum_vk11_api_level &&
driver_api_version >= VK_API_VERSION_1_1) {
return VK_API_VERSION_1_1;
}
return VK_API_VERSION_1_0;
}
Определить совместимость профиля Vulkan
Профили Vulkan — это JSON-файлы, определяющие набор обязательных функций, расширений, возможностей и минимальных ограничений параметров, которые устройство Vulkan должно поддерживать для совместимости с профилем. Чтобы определить совместимость устройства с определённым профилем Vulkan, например, с профилем Android Baseline 2022, используйте библиотеку API Vulkan Profiles с открытым исходным кодом. Вы также можете самостоятельно проанализировать JSON-файл профиля и запросить информацию о возможностях устройства, используя соответствующие API Vulkan, для определения совместимости с профилем.
Профили Вулкана
Android использует профили Vulkan , которые определяют, какие функции и расширения доступны для каждого устройства под управлением Android.
Базовый профиль Android (ABP) — это первая попытка создания профиля Vulkan. ABP2021 и ABP2022 — это профили, ориентированные на ретроспективное использование и призванные охватить более 85% активных устройств на тот момент. В дальнейшем новые ABP выпускаться не будут.
Профили Vulkan для Android (VPA) — это новый перспективный профиль, призванный отражать потребности разработчиков программного обеспечения и обеспечивать единообразие функций, как только разработчики оборудования смогут их реализовать. VPA15_minimums — первый профиль для Android 15, и каждый год будет выпускаться новый VPA для каждого основного релиза Android.
Реализовать фрейм-пакинг
Правильный темп кадров — важнейший фактор обеспечения высокого качества игрового процесса. В комплект Android Game Development Kit входит библиотека Frame Pacing, которая поможет вашей игре добиться оптимального темпа кадров. Подробнее о реализации см. в статье «Интеграция Android Frame Pacing в ваш рендерер Vulkan» .
Не полагайтесь на неявную синхронизацию и регулировку кадров
vkAcquireNextImageKHR и vkQueuePresentKHR используются для управления цепочкой обмена. Не полагайтесь на их потенциальное блокирующее поведение при синхронизации общих приложений или графического процессора.
Точное поведение блокировки этих функций может существенно различаться в зависимости от:
- Android-устройства
- Драйверы графического процессора
- Состояния движка презентации ( VkPresentModeKHR )
Единственная цель функции vkAcquireNextImageKHR — получить доступное презентабельное изображение, и она может блокировать запрос, а может и не блокировать. Аналогично, функция vkQueuePresentKHR ставит запрос на отображение изображения в очередь и также может блокировать запрос, а может и не блокировать.
Ни одна из функций не обеспечивает надежных гарантий синхронизации несвязанных задач ЦП или операций ГП.
Для надежной синхронизации всегда используйте явные примитивы Vulkan, такие как семафоры для зависимостей между графическими процессорами (например, для рендеринга в текущий момент), барьеры для синхронизации между графическими процессорами (например, для определения момента завершения рендеринга на центральном процессоре) и конвейерные барьеры или события для более детального выполнения графического процессора и зависимостей от памяти. Использование явной синхронизации обеспечивает предсказуемое поведение и позволяет избежать трудноуловимых ошибок, вызванных вариациями синхронизации, характерными для различных реализаций аппаратной экосистемы Android.
Осуществить предварительную ротацию
Устройства Android могут отображать изображение в нескольких ориентациях. Ориентация устройства может отличаться от ориентации поверхности рендеринга. В отличие от OpenGL ES на Android, Vulkan не обрабатывает расхождения между ними. Чтобы понять, как работает процесс ориентации и как оптимально обрабатывать различия в ориентации при использовании Vulkan, см . раздел Управление поворотом устройства с помощью предварительного поворота Vulkan .
Устранение неполадок и профилирование рендеринга Vulkan
Доступно множество инструментов, которые помогут вам диагностировать проблемы рендеринга и производительности кода рендеринга Vulkan.
Дополнительную информацию об инструментах отладки и профилирования Vulkan можно найти в разделе «Инструменты и расширенные функции» .
Слои проверки Vulkan
Слои валидации Vulkan — это библиотеки времени выполнения, которые можно включить для проверки вызовов API Vulkan и выдачи предупреждений или сообщений об ошибках, связанных с некорректным или неоптимальным использованием. Эти слои валидации по умолчанию отключены, поскольку процесс валидации увеличивает нагрузку на время выполнения и влияет на производительность игры. Сведения об использовании слоёв валидации в игре см. в разделе «Отладка с использованием слоя валидации» .
Инструменты захвата кадров
Используйте инструменты захвата кадров для записи и воспроизведения вызовов API Vulkan, выполняемых во время игрового кадра. Эти инструменты позволяют:
- Просмотр информации и визуализаций активных графических ресурсов
- Посмотрите последовательность вызовов API, выполняемых вашей игрой, и просмотрите параметры API.
- Изучите состояние графического конвейера во время вызова отрисовки.
- Визуализируйте результаты рендеринга до определенного вызова отрисовки в кадре.
Используйте инструмент RenderDoc с открытым исходным кодом для захвата кадров из игр на Android. RenderDoc поддерживает захват кадров как Vulkan, так и OpenGL ES.
Android GPU Inspector (AGI) также можно использовать для захвата кадров Vulkan.
Инструменты анализа производительности
Используйте инструменты анализа производительности для выявления проблем с рендерингом в вашей игре, которые приводят к неоптимальной частоте кадров. Поставщики графических процессоров предоставляют инструменты, предназначенные для профилирования вашей игры и предоставления данных о производительности, специфичных для их архитектур. Характеристики производительности и узкие места вашей игры могут значительно различаться при рендеринге на графических процессорах разных производителей или даже на графических процессорах разных поколений одного производителя.
Вы также можете использовать Android GPU Inspector для сбора и анализа данных о производительности. В отличие от инструментов других производителей, Android GPU Inspector совместим с несколькими графическими процессорами разных производителей. Однако Android GPU Inspector не поддерживает старые устройства Android и может быть несовместим со всеми новыми устройствами.
Улучшите тестирование Vulkan с помощью CTS-D
Производители устройств на базе Android используют набор тестов совместимости (CTS), чтобы гарантировать совместимость своих устройств. Тесты CTS, разработанные разработчиками приложений для Android (CTS-D), представляют собой тесты, проводимые разработчиками приложений для Android, чтобы убедиться, что будущие устройства Android соответствуют их требованиям и смогут работать с их приложениями без сбоев и ошибок.
Если вам удалось спровоцировать новую ошибку в приложении Vulkan, которая затрагивает какое-либо конкретное устройство Android, вы можете отправить новое предложение по тестированию, описав проблему и способы её устранения. Это гарантирует, что проблема будет устранена в будущем обновлении устройства, а также гарантирует, что аналогичная ошибка не возникнет на других устройствах.
Ознакомьтесь с процессом подачи заявки на CTS, чтобы получить пошаговые инструкции о том, как подать заявку на тестирование.