Начните работу с Vulkan на Android
Vulkan — это основной низкоуровневый графический API на Android. Vulkan обеспечивает оптимальную производительность для игр, реализующих собственный игровой движок и рендерер.
Для успешной реализации Vulkan в вашем игровом движке необходимо:
- Определите, какие устройства Android следует использовать с Vulkan
- Поймите недостатки поддержки старых устройств Android
- Добавьте Vulkan в целевую сборку Android
- Выберите компилятор шейдеров для создания SPIR-V для Vulkan
- Определить доступную версию API Vulkan во время выполнения
- Узнайте, как оптимизировать операции рендеринга Vulkan с помощью профилей Vulkan, темпа кадров и предварительного вращения.
- Выберите графические инструменты для отладки и анализа производительности
- Примечание: Информацию об использовании Vulkan на Android с игровыми движками Unity или Unreal см. в разделе:
- Вулкан на Unity
- Вулкан на Unreal
Выберите минимальные характеристики устройства для Vulkan
Vulkan доступен на Android, начиная с 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. Многие старые устройства ограничены версией 1.0.3 API Vulkan и часто не имеют широко используемых расширений Vulkan, доступных на более современном оборудовании.
Стабильность
Старые устройства Android могут использовать устаревшие драйверы Vulkan. Эти версии драйверов могут содержать ошибки, которые могут повлиять на стабильность вашей игры. Обход ошибок драйверов может потребовать значительного количества времени на тестирование и разработку.
Добавьте Vulkan в свой проект
Чтобы добавить Vulkan в свой проект, вам необходимо:
- Включить заголовки API Vulkan
- Компилировать код шейдера в SPIR-V
- Вызов API Vulkan во время выполнения
Включить заголовки API Vulkan
Ваша игра должна включать файлы заголовков API Vulkan для компиляции кода, использующего 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 или High-level Shader Language (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
Поддержка платформы Android версии API Vulkan не гарантирует, что версия API поддерживается драйвером Vulkan устройства. Устройство под управлением Android 13 может поддерживать только версию 1.1 API Vulkan.
При инициализации 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 Baseline Profile (ABP) — это первая попытка создания Vulkan Profile. 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 используются для управления цепочкой обмена. Избегайте полагаться на их потенциальное блокирующее поведение для общего приложения или синхронизации GPU.
Точное поведение блокировки этих функций может существенно различаться в зависимости от:
- Android-устройства
- Драйверы графического процессора
- Состояния движка презентации ( VkPresentModeKHR )
Единственная цель vkAcquireNextImageKHR — получить доступное презентабельное изображение, и оно может блокировать или не блокировать. Аналогично, vkQueuePresentKHR ставит в очередь запрос на отображение изображения и также может блокировать или не блокировать.
Ни одна из функций не обеспечивает надежных гарантий синхронизации не связанных между собой задач ЦП или операций ГП.
Для надежной синхронизации всегда используйте явные примитивы Vulkan, такие как семафоры для зависимостей GPU-GPU (например, рендеринг-в-настоящее), ограждения для синхронизации GPU-CPU (например, знание того, когда рендеринг завершен на CPU), и конвейерные барьеры или события для более мелкозернистого выполнения GPU и зависимостей памяти. Использование явной синхронизации обеспечивает предсказуемое поведение и позволяет избежать неявных ошибок, вызванных вариациями синхронизации, характерными для реализации, присущими разнообразной аппаратной экосистеме 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 совместим с несколькими GPU от разных поставщиков. Однако Android GPU Inspector не поддерживает старые устройства Android и может быть несовместим со всеми новыми устройствами.
Улучшение тестирования Vulkan с помощью CTS-D
Производители устройств на базе Android используют Compatibility Test Suite (CTS), чтобы гарантировать совместимость своих устройств. Developer-Powered CTS (CTS-D) — это тесты, которые разработчики приложений Android проводят, чтобы убедиться, что будущие устройства Android соответствуют их вариантам использования и могут запускать их приложения плавно и без ошибок.
Если вам удастся вызвать новую ошибку с вашим приложением Vulkan, которая влияет на какое-либо конкретное устройство на базе Android, вы можете отправить новое тестовое предложение, описав вашу проблему и способы ее проверки. Это гарантирует, что проблема будет исправлена в будущем обновлении для устройства, а также гарантирует, что та же ошибка не возникнет ни на каком другом устройстве.
Ознакомьтесь с процессом подачи заявки на CTS, чтобы получить пошаговые инструкции о том, как подать заявку на тестирование.