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

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

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

Чтобы успешно внедрить Vulkan в свой игровой движок, вам необходимо:

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

Выберите минимальные характеристики устройства для 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 Baseline 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 или языке шейдеров высокого уровня (HLSL), и скомпилировать его в модули SPIR-V для использования с Vulkan.

Компилятор shaperc можно использовать для компиляции программ шейдеров, написанных на GLSL, в SPIR-V. Если ваша игра использует HLSL, DirectXShaderCompiler поддерживает вывод SPIR-V. Обычно вы компилируете программы шейдеров в автономном режиме как часть процесса создания ресурсов для вашей игры и включаете модули SPIR-V как часть своих ресурсов времени выполнения.

Вызов API Vulkan во время выполнения

Чтобы вызвать API Vulkan, вашей игре необходимо получить указатели функций на вызовы API Vulkan. Самый простой способ сделать это — подключиться к общей библиотеке libvulkan.so , которая включена в Android NDK. Связывание с библиотекой имеет два недостатка: дополнительные затраты на диспетчеризацию функций и ограничения на автоматическое разрешение указателей функций Vulkan API.

Когда вы вызываете функцию 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

Максимальный номер версии Vulkan API, доступный на данном устройстве, определяется версией 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) и выше

Поддержка драйверов Вулкан

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

Профили Вулкана

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

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

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

Внедрить синхронизацию кадров

Правильный темп кадров — важная часть обеспечения высококачественного игрового процесса. В комплект разработки игр для Android входит библиотека Frame Pacing, которая поможет вашей игре достичь оптимального темпа кадров. Дополнительные сведения о реализации см. в разделе «Интеграция Android Frame Pacing в средство визуализации Vulkan» .

Внедрить предварительную ротацию

Устройства 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 (AGI) также можно использовать для захвата кадров Vulkan.

Инструменты анализа производительности

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

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

Улучшите тестирование Vulkan с помощью CTS-D

Производители устройств на базе Android используют набор тестов совместимости (CTS), чтобы убедиться в совместимости своих устройств. CTS на базе разработчиков (CTS-D) — это тесты, представленные разработчиками приложений Android, чтобы убедиться, что будущие устройства Android удовлетворяют их сценариям использования и смогут запускать свои приложения плавно и без ошибок.

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

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