Определите, какой API используется для рендеринга игры: Vulkan или OpenGL ES.

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

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

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

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

Отслеживание с помощью API Attribution Reporting

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

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

  2. Нажмите на вкладку SQL в APA. Когда откроется экран анализа трассировки, в меню навигации интерфейса нажмите на вкладку 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 Игр LevelUp, то для действительности трассировки необходимо соблюдать определенные требования к оборудованию.

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

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

  • Любое устройство, на котором установлен графический процессор SLSI (Samsung) с AMD Xclipse.
  • Pixel 11