При разработке или оптимизации игр для 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, выполните следующие действия:
Запишите трассировку с помощью APA. Запустите игру и используйте APA, чтобы записать трассировку системы во время сегмента, который вы хотите проанализировать, например в момент игрового процесса, когда вы подозреваете пропуск кадров. После подключения устройства и завершения записи трассировки данные трассировки загружаются в интерфейс APA.
Нажмите на вкладку SQL в APA. Когда откроется экран анализа трассировки, в меню навигации интерфейса нажмите на вкладку SQL, чтобы открыть среду обработчика трассировки, в которой можно напрямую запрашивать данные.
Вставьте 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;Выполните запрос. Для этого нажмите кнопку Выполнить запрос рядом с полем ввода. После выполнения запроса на панели результатов появится таблица с названием процесса (
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