Search
Write a publication
Pull to refresh

Профайл-виджет для игр

Level of difficultyEasy
Reading time4 min
Views802

Этот виджет используется для быстрого анализа производительности на проекте. Он легко открывается по хоткею и показывает основную информацию по перфомансу. Можно сразу понять все ли впорядке, а если нет, то почему. Это не глубокий анализ, а, так скажем, "первичный осмотр пациента", который может дать направление куда копать.

Виджет служит простым гейтом для разработчиков/дизайнеров и VFX чтобы понять, что они случайно не завалили перфоманс какими-то неправильными действиями.

Его кастомизация позволяет так же и разработчикам детализировать необходимые места и профилировать их.

Итак, что он умеет? Рассмотрим сверху вниз

График времени кадра

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

Все это добро рисуется с историей на 100-120 кадров, то есть за прошедшие пару секунд. Здесь сразу видно общую картину, если явно выделяется какая-то зона, если она стала занимать слишком много времени от кадра. Так же видны "спайки", то есть единомоментные просадки зон в определенных кадрах.

Можно навести курсор на этот график и он перестанет обновляться, отобразив картину по кадру, на который указывает курсор

Это очень помогает базово найти в чем проблема: может быть рендеринг идет слишком долго, или апдейт UI слишком тормозит и почему-то пересчитывается каждый кадр. Или, например, увидеть какие-то лаги при инстанциации объектов или переключении игровой логики.

Зоны можно кастомизировать, добавляя свои диапазоны профайлинга, для исследования каких-то определенных случаев

NanoProfiler

Внутри это работает довольно просто. Есть простой scoped таймер, который отмечает зону с определенным именем. Все это сохраняется в стек для текущего кадра. У зоны может быть вложенная зона или даже несколько. Например, весь кадр - это одна большая зона, а всякие рендеринги и апдейты уже дочерние. Вложенность может быть любая

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

Поэтому одноименные зоны суммируются, а их время вычитается из родительской зоны. Таким образом, сумма времен всех зон равняется ровно длительности кадра. Например, апдейт UI - это часть общего апдейта, и его время вычитается из общего, давая более понятную картину

В процессе аггрегации может получиться много зон, значительно больше того, что влазит в экран. А виджет довольно компактный, тк занимает часть экрана игры. Поэтому выводится только N зон, с самым большим временем работы. Остальные суммируются и выводятся как other. Но есть возможность завести специальную зону, имя которой должно начинаться с подчеркивания (_zone), тогда она всегда будет видна

Это работает динамически, что гарантирует что что-то крупное точно будет отображено.

График основных метрик: FPS, Draw Calls, Drawn primitives, Used memory

Тут все просто, точно так же показываются последние 100-120 кадров, текущее значение, минимальное и максимальное значение на промежутке. А так же цветовая дифференциация метрик: красное - плохо, желтое - так себе, зеленое - перфект

Эти метрики позволяют обще посмотреть что происходит в игре по этим основным метрикам. А самое главное, цвет метрик (и черточек) показывает все ли хорошо. Цвет считывается глазами довольно быстро и однозначно. Позволяет так же вылавливать точечные проблемы, или корреляцию с действиями в игре

Только параметр памяти обновляется значительно реже, раз в секунду. Так как там рост и не такой быстрый как правило.

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

Количество сущностей на сцене

Количество сущностей на сцене. В playrix у нас движок называется VSO, поэтому соответствующая подпись - VSO entities

Это кастомизируемый набор метрик, отражающий "сложность сцены". Например, на графике времени кадра мы видим что апдейт UI занимает слишком много времени. Но почему? Как правило это либо косяки в логике, либо просто на сцене дофига UI элементов

В целом, большинство проблем в unity-like движках, это раздутая и не оптимизировання сцена, где каждая горошина проработана и рендерится.

Это сразу видно в виджете и здесь так же используется цветовая дифференциация. Если метрика стала красной, то может быть это то самое проблемное место. Как в примере с долгим апдейтом UI, может оказаться что у нас много Images и Nodes.

Важно отметить, что если одна или несколько метрик стали красными - это не значит что 100% перфомансу стало плохо. Это стоит воспринимать как эвристику, помогающую базово понять, есть ли проблема. Если на сцене 20 тысяч нод, но FPS стабильно на 60, значит все нормально. Ведь финальная метрика - это FPS

Пороговые значения настраиваются в конфиге пальцем в небо опытным разработчиком на основе многолетней экспертизы. Но это нормально, ведь эти матрики косвенные и не утверждают что та или иная метрика точно портит перфоманс. Это скорее как набор анализов, на основе которых разработчик выносит диагноз.

Заключение

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

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

А если не понятно до конца в чем именно проблема, то он поможет значительно сузить зону поиска и уже переходить к более точным и сложным способам профайлинга

Репозиторий с исходным кодом:
https://github.com/zenkovich/imgui_perfmon

Пример подключения в демо ImGUI:
https://github.com/zenkovich/imgui/blob/f4baf35d8e4d7fbc9a4557eb8d679e7dc7dfe050/examples/example_win32_directx9/main.cpp#L98


Мой телеграм-канал для менее формального обсуждания: https://t.me/o2engine

Tags:
Hubs:
Total votes 6: ↑6 and ↓0+6
Comments0

Articles