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

Начните работу с 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, чтобы получить пошаговые инструкции о том, как отправить тестовое предложение.

,

Начните работу с 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, чтобы получить пошаговые инструкции о том, как отправить тестовое предложение.

,

Начните работу с 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. Связывание с библиотекой имеет два недостатка: дополнительная функция отправки накладных расходов и ограничения, на которые автоматически разрешаются указатели функций API Vulkan.

Когда вы вызываете функцию API Vulkan, управление проходит через таблицу диспетчеры , управляемую конструкцией, называемой погрузчиком Vulkan. Android использует свою собственную реализацию Vulkan Loader , а не Lunarg Loader. Эта система погрузчиков является частью архитектуры слоя Vulkan API. Связь с системной библиотекой во время сборки приводит к дополнительному уровню отправки для данного вызова API. Хотя накладные расходы невелики, это может быть заметно для игр, которые выполняют высокие объемы вулканских вызовов.

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

Чтобы смягчить эти проблемы, динамически решает указатели ко всем функциям Vulkan, которые вы намереваетесь использовать во время выполнения. Одним из способов достижения этого является использование библиотеки мета-загрузки с открытым исходным кодом, такой как Volk . Образец Agdktunnel игра интегрирует Volk для этой цели. Если вы используете библиотеку мета-загрузки, не ссылайтесь на библиотеку libvulkan.so в ваших сценариях сборки.

Определить доступную версию Vulkan API

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 поддерживается водителем устройства. Устройство под управлением Android 13 может поддерживать только версию 1.1 API Vulkan.

При инициализации Vulkan не запрашивайте версию API, больше, чем:

  • Максимальная версия API Vulkan для версии Android работает на устройстве
  • Версия API Vulkan сообщила VkenumerateInstanceversion
  • Версия API Vulkan, сообщаемая свойством apiVersion структуры VkphysicalDeviceProperties

Пример определения наивысшей поддерживаемой версии Vulkan API следует:

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

Вулканские профили

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

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

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

Реализовать каркасную темп

Правильный каркасный ритм является неотъемлемой частью предоставления высококачественного игрового процесса. Комплект для разработки игр Android включает в себя библиотеку Pacing Pacing, чтобы помочь вашей игре достичь оптимального каркаса. Для получения дополнительной информации о реализации см. Включите Ingrate Android Frame Suping в свой вулканский рендерер .

Реализовать предварительное обмощение

Устройства Android могут отображаться в нескольких ориентациях. Ориентация устройства может отличаться от ориентации поверхности рендеринга. В отличие от OpenGL на Android, Vulkan не справляется с несоответствиями между ними. Чтобы понять, как работает процесс ориентации, и оптимальный метод обработки ориентации при использовании Vulkan, см. Вращение устройства Grange с предварительной до-ротацией Vulkan .

Устранение неполадок и профиль veling

Доступно несколько инструментов, чтобы помочь вам диагностировать проблемы с рендерингом и проблемы с производительностью с кодом рендеринга Vulkan.

Для получения дополнительной информации о инструментах отладки и профилирования Vulkan проверьте раздел «Инструменты и расширенные функции» .

Вулканские проверки слоев

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

Инструменты захвата кадров

Используйте инструменты захвата кадров для записи и воспроизведения вызовов API Vulkan, выполненных во время игры. Эти инструменты позволяют вам:

  • Просмотреть информацию о и визуализации активных графических ресурсов
  • Смотрите последовательность вызовов API, сделанных вашей игрой, и см. Параметры API
  • Исследуйте состояние графического трубопровода во время вызова.
  • Визуализируйте результаты рендеринга до определенного вызова рисования в кадре

Используйте инструмент с открытым исходным кодом RenderDoc , чтобы захватить рамки из игр, работающих на Android. Renderdoc поддерживает захват кадров как Vulkan, так и OpenGL ES.

Инспектор Android GPU (AGI) также может быть использован для захвата вулканских кадров.

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

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

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

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

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

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

Проверьте процесс отправки CTS для пошаговых инструкций о том, как отправить тестовое предложение.