Перейти к содержанию

Vulkan

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

Основы Vulkan

Зачем появился

Vulkan даёт приложению больше контроля над ресурсами GPU, отправкой команд и синхронизацией. По сравнению с OpenGL ES он переносит часть работы из драйвера в приложение. Это может снизить нагрузку на CPU со стороны драйвера и помочь распределить подготовку сложной сцены между потоками, но увеличивает стоимость разработки и поддержки.

Меньшие накладные расходы не гарантируют прирост FPS: нагрузка на GPU, пропускная способность памяти и равномерность кадров тоже важны. Измеряй результат на целевых устройствах.

Отличия от OpenGL ES

OpenGL ES - API с состоянием, где больше работы неявно выполняет драйвер. В Vulkan приложение явно определяет значительную часть этой работы:

  • выделяет и привязывает память для буферов и изображений, управляет временем жизни ресурсов;
  • создаёт конвейеры с настройками шейдеров и фиксированных стадий;
  • записывает команды в командные буферы и отправляет их в очереди;
  • при необходимости синхронизирует доступ к ресурсам и вывод кадра барьерами, семафорами и fence-объектами.

Разные потоки CPU могут записывать отдельные командные буферы с учётом правил многопоточности Vulkan. Это не означает, что один буфер можно одновременно записывать из нескольких потоков. Шейдерные модули обычно передают в формате SPIR-V, а не как исходный текст GLSL для компиляции драйвером во время работы.

OpenGL ES остаётся полезным для небольших собственных рендереров. Vulkan стоит рассматривать, когда движку нужен его явный контроль или возможности, которых нет в OpenGL ES. Решение о переходе должно опираться на профилирование и охват устройств, а не на название API.

Компромиссы

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

Android предоставляет Vulkan через NDK начиная с API 24, но одной версии ОС недостаточно, чтобы подтвердить поддержку нужной версии Vulkan и возможностей устройства. Проверяй их во время выполнения и предусматривай поддерживаемый способ рендеринга для устройств вне целевого набора. Объявляй Vulkan обязательной возможностью в манифесте, только если без него приложение не работает.

Где применяется в Android

Vulkan часто работает внутри игровых и графических движков; также он подходит для собственной 3D-, AR/VR- и вычислительно сложной визуализации. Обычному экрану на Compose или View прямые вызовы Vulkan, как правило, не нужны. Приложение может использовать движок или SDK с Vulkan-бэкендом, не обращаясь к Vulkan напрямую.

О выборе более высокоуровневого 3D-рендерера смотри Google Filament. Общая картина изложена в статье 2D- и 3D-рендеринг.