Родные и фирменные движки

Начните работу с Vulkan на Android.

Vulkan — это основной низкоуровневый графический API на Android. Vulkan обеспечивает оптимальную производительность для игр, которые используют собственный игровой движок и рендерер.

Для успешной интеграции Vulkan в ваш игровой движок необходимо:

  • Определите, какие устройства Android можно использовать с Vulkan.
  • Разберитесь в компромиссах, связанных с поддержкой старых устройств Android.
  • Добавьте Vulkan в список целевых объектов сборки Android.
  • Выберите компилятор шейдеров для создания SPIR-V для Vulkan.
  • Определите доступную версию API Vulkan во время выполнения.
  • Узнайте, как оптимизировать операции рендеринга Vulkan с помощью профилей Vulkan, синхронизации кадров и предварительного поворота.
  • Выберите графические инструменты для отладки и анализа производительности.

Выберите минимальные технические характеристики устройства для Vulkan.

Vulkan доступен на Android, начиная с версии 7.0 (уровень API 24). Не все устройства Android, работающие под управлением Android 7.0 или выше, поддерживают Vulkan. Вам необходимо определить, какие устройства Android, поддерживающие Vulkan, поддерживает ваша игра.

Рекомендации

Для поддержки Vulkan используйте следующие минимальные требования:

  • Устройство работает под управлением Android 10.0 (уровень API 29) или выше.
  • Устройство поддерживает API Vulkan версии 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.

Для компиляции кода, использующего 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 может поддерживать только версию 1.1 API Vulkan.

При инициализации Vulkan не запрашивайте версию API, превышающую:

  • Максимальная версия Vulkan API для версии 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 с открытым исходным кодом. Вы также можете самостоятельно проанализировать JSON-файл профиля и запросить информацию о возможностях устройства, используя соответствующие API Vulkan, чтобы определить совместимость профиля.

Профили Vulkan

В Android используются профили Vulkan , которые определяют, какие функции и расширения доступны для каждого из устройств, работающих под управлением Android.

Android Baseline Profile (ABP) — это первая попытка создания профиля Vulkan. ABP2021 и ABP2022 — это профили, ориентированные на более чем 85% активных устройств на тот момент. В дальнейшем новых профилей ABP выпускаться не будет.

Vulkan Profiles for Android (VPA) — это новый перспективный профиль, призванный учитывать потребности разработчиков программного обеспечения и обеспечивать согласованность функций, как только разработчики оборудования смогут их реализовать. VPA15_minimums — это первый профиль для Android 15, и каждый год будет выпускаться новый VPA для каждого крупного релиза Android.

Реализовать частоту кадров

Правильная синхронизация кадров — важная составляющая обеспечения высококачественного игрового процесса. Комплект разработки игр для Android включает библиотеку 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 используют набор тестов на совместимость (Compatibility Test Suite, CTS), чтобы гарантировать совместимость своих устройств. Тесты CTS, разработанные разработчиками (Developer-Powered CTS, CTS-D) , представляют собой тесты, предоставляемые разработчиками приложений для Android, чтобы убедиться, что будущие устройства Android соответствуют их сценариям использования и могут бесперебойно и без ошибок запускать их приложения.

Если вам удастся обнаружить новую ошибку в вашем приложении Vulkan, затрагивающую какое-либо конкретное устройство на базе Android, вы можете отправить новое предложение по тестированию, описав проблему и способы ее проверки. Это гарантирует, что проблема будет исправлена ​​в будущем обновлении для данного устройства, а также предотвратит повторение подобной ошибки на других устройствах.

Ознакомьтесь с пошаговыми инструкциями по подаче заявки на тестирование на сайте CTS .