Как определить различия между API рендеринга игр Vulkan и OpenGL ES?

При разработке или оптимизации игр для Android часто бывает полезно понимать, какой графический конвейер использует ваш движок; движки могут выбирать Vulkan или GLES без явных сигналов, доступных разработчику. К сожалению, бывают ситуации, когда полагаться на logcat для проверки того, работает ли игра на Vulkan или незаметно переключилась на OpenGL ES, может быть ненадежно.

В этом руководстве показано, как использовать анализатор производительности Android (APA) и пользовательские SQL-запросы Perfetto для точного определения активного API рендеринга игры.

Ограничения проверки на основе логов

  • Упрощенные логи : В производственных сборках часто скрываются данные об инициализации и загрузке драйверов.
  • Ложные срабатывания : Некоторые игровые движки загружают во время запуска как библиотеки Vulkan, так и OpenGL ES, выводя в лог информацию об инициализации обеих библиотек, даже если одна из них в конечном итоге дает сбой и запускает резервный процесс.
  • Скрытые резервные варианты : если инициализация Vulkan завершается неудачей из-за проблем с драйверами, специфичных для устройства, движки часто переключаются на OpenGL ES без возникновения критических ошибок.

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

С помощью Android Performance Analyzer вы можете записать трассировку системы и точно проанализировать данные кадров с помощью SQL-запросов. Выполните следующие шаги, чтобы измерить использование Vulkan и GLES:

  1. Захват трассировки с помощью APA : Запустите игру и используйте APA для захвата системной трассировки в том сегменте, который вы хотите проанализировать, например, в момент игрового процесса, когда вы подозреваете падение частоты кадров. После подключения устройства и завершения записи трассировки данные трассировки загружаются в интерфейс APA.

  2. В формате APA щелкните вкладку SQL : Когда откроется экран анализа трассировки, в навигационном меню пользовательского интерфейса щелкните вкладку SQL , чтобы открыть среду обработки трассировки, где вы можете напрямую запрашивать данные.

  3. Вставьте следующий SQL-запрос на вкладку APA SQL : Скопируйте следующий SQL-запрос и вставьте его в поле ввода запроса. Этот запрос сканирует трассировку на наличие событий API отрисовки, таких как eglSwapBuffers , QueuePresentKHR и vkQueuePresentKHR . Он группирует их по имени процесса и вычисляет количество вызовов API рендеринга и процентное распределение вызовов рендеринга Vulkan и OpenGL ES:

    WITH raw_slices AS (
      -- 1. Map each slice (API call) to its corresponding process or package via UTID and UPID
      SELECT
        p.name AS process_name,
        s.name AS slice_name
      FROM slice s
      JOIN thread_track tt ON s.track_id = tt.id
      JOIN thread t USING (utid)
      JOIN process p USING (upid)
      WHERE (s.name LIKE 'eglSwapBuffers%'
        OR s.name IN ('QueuePresentKHR', 'vkQueuePresentKHR'))
        -- Optional: To isolate your game, uncomment the following and filter by package name and thread name:
        -- AND p.name = 'com.example.mygame'
        -- AND t.name = 'RenderThread'
    ),
    process_stats AS (
      -- 2. Aggregate counts per individual process
      SELECT
        process_name,
        SUM(CASE WHEN slice_name LIKE 'eglSwapBuffers%' THEN 1 ELSE 0 END) AS egl_count,
        SUM(CASE WHEN slice_name IN ('QueuePresentKHR', 'vkQueuePresentKHR') THEN 1 ELSE 0 END) AS vulkan_count
      FROM raw_slices
      GROUP BY process_name
    ),
    process_totals AS (
      -- 3. Calculate total counts for denominator calculation
      SELECT
        process_name,
        egl_count,
        vulkan_count,
        (egl_count + vulkan_count) AS total_count
      FROM process_stats
    )
    -- 4. Calculate final percentage shares per row, preventing division by zero errors
    SELECT
      process_name,
      egl_count,
      vulkan_count,
      total_count,
      ROUND(CAST(egl_count AS REAL) * 100 / NULLIF(total_count, 0), 2) AS "egl_percentage(%)",
      ROUND(CAST(vulkan_count AS REAL) * 100 / NULLIF(total_count, 0), 2) AS "vulkan_percentage(%)"
    FROM process_totals
    ORDER BY total_count DESC;
    
  4. Выполните запрос : нажмите кнопку «Выполнить запрос» рядом с полем ввода. После выполнения запроса в области результатов появится таблица, отображающая имя процесса ( process_name ), количество презентаций OpenGL ES ( egl_count ), количество презентаций Vulkan ( vulkan_count ), общее количество презентаций ( total_count ) и процент использования каждого API ( egl_percentage(%) и vulkan_percentage(%) ).

    На экране отображается выполненный SQL-запрос и полученные в результате метрики API рендеринга в таблице.

Распространенные ошибки

  • Избегайте путаницы SurfaceFlinger : всегда ограничивайте поиск потоком приложения вашей игры ( RenderThread ). Системные процессы композитора, такие как SurfaceFlinger могут отображать дорожки Vulkan или EGL, представляющие рендеринг пользовательского интерфейса системы, а не внутренний конвейер рендеринга вашей игры. Чтобы изолировать вашу игру, раскомментируйте необязательные фильтры в предложении WHERE основного SQL-запроса и замените 'com.example.mygame' на имя пакета вашей игры:

    -- AND p.name = 'com.example.mygame'
    -- AND t.name = 'RenderThread'
    
  • Период прогрева : Запись трассировки всегда производится после полной загрузки основной 3D-сцены игры. Запись во время заставок или переходов между сценами загрузки может привести к некорректной инициализации.

Требования к отслеживанию исключений LevelUp

Если вы используете Android Performance Analyzer (APA) для записи трассировки, необходимой для получения исключения из правил Google Play Games LevelUp, существуют определенные аппаратные требования, чтобы трассировка считалась действительной.

Настоятельно рекомендуется фиксировать трассировку с помощью одного из целевых эталонных устройств Level Up .

Кроме того, для обеспечения точной проверки трассировка не должна выполняться на устройстве, использующем графический процессор ANGLE. В частности, для записи трассировки исключения LevelUp нельзя использовать следующие устройства:

  • Любое устройство, в котором производитель графического процессора — SLSI (Samsung), использующее графические процессоры AMD Xclipse.
  • Пиксель 11