Unity iOS и Android содержат встроенный профайлер. Он включён во все версии дополнений и не является Pro функцией (хотя Pro версии содержат расширенный профайлер). Встроенный профайлер вызывает консольные сообщения из игры, запущенной на устройстве. Эти сообщения пишутся каждые 30 секунд и дают представление о том, как работает игра. Не всегда просто понять, что значат эти сообщения, но, как минимум, вы должны уметь быстро определять упирается ли ваша игра в CPU или GPU. А если это CPU, то виноват ли код скрипта, или может это сборка мусора Mono замедляет процесс. Ниже на этой странице, вы сможете научиться настраивать встроенный профайлер.
Вот пример выходной информации встроенного профайлера.
iPhone/iPad Unity internal profiler stats:
cpu-player> min: 9.8 max: 24.0 avg: 16.3
cpu-ogles-drv> min: 1.8 max: 8.2 avg: 4.3
cpu-waits-gpu> min: 0.8 max: 1.2 avg: 0.9
cpu-present> min: 1.2 max: 3.9 avg: 1.6
frametime> min: 31.9 max: 37.8 avg: 34.1
draw-call #> min: 4 max: 9 avg: 6 | batched: 10
tris #> min: 3590 max: 4561 avg: 3871 | batched: 3572
verts #> min: 1940 max: 2487 avg: 2104 | batched: 1900
player-detail> physx: 1.2 animation: 1.2 culling: 0.5 skinning: 0.0 batching: 0.2 render: 12.0 fixed-update-count: 1 .. 2
mono-scripts> update: 0.5 fixedUpdate: 0.0 coroutines: 0.0
mono-memory> used heap: 233472 allocated heap: 548864 max number of collections: 1 collection total duration: 5.7
Все значения времени измеряются в миллисекундах на кадр. Вы можете увидеть минимальное, максимальное и среднее время за последние 30 кадров.
cpu-player | Отображает время, которое ваша игра затрачивает на запуск кода внутри движка Unity и на запуск скриптов в процессоре. |
cpu-ogles-drv | Отображает время, затраченное на запуск кода OpenGL ES драйвера в процессоре. Много факторов, вроде количества вызовов отрисовки (Draw Calls), количества изменений внутреннего состояния рендеринга, настроек системы рендеринга и даже количества обработанных вершин, может повлиять на статистику драйвера. |
cpu-waits-gpu | Отображает время, которое CPU простаивает ожидая, пока GPU завершит рендеринг. Если это число превышает 2–3 милисекунды, то это значит, что в вашем приложении вызывает задержк, скорее всего GPU/fillrate. Если это значение будет слишком маленьким, то профайлер пропустит его отображение. |
msaa-resolve | Время, затраченное на применение сглаживания (anti-aliasing). |
cpu-present | Количество времени, затраченное на запуск команды presentRenderbuffer в OpenGL ES. |
frametime | Демонстрирует общую длительность игрового кадра. Учтите, что iOS устройства всегда зафиксированы на частоте обновления 60 Гц, так что вы всегда будет получать результат равный 16.7 мс (1000ms/60Hz = 16.7ms). |
tris # | Общее количество треугольников, отправленных на рендеринг. |
verts # | Общее число вершин, отправленных на рендеринг. Вам следует сохранять это значение ниже 10000, если используете только статичную геометрию, но если у вас есть много skinned геометрии, то вам нужно сохранять его ещё более низким. |
batched | Количество вызовов отрисовки, треугольников и вершин, которые были автоматически подвержены батчингу (пакетная обработка) движком. Сравнение этих чисел с общим количеством вызовов отрисовки и треугольников даст вам представление о том, как хорошо ваша сцена подготовлена к батчингу. Распределите столько материалов, сколько возможно среди ваших объектов, чтобы улучшить батчинг. |
Раздел player-detail предоставляет детальный разбор того, что происходит внутри движка:-
physx | Время, затраченное на физику. |
animation | Время, затраченное на анимирование костей. |
culling | Время, затраченное на отсечение объектов за пределами усечённого вида камеры. |
skinning | Время, затраченное на анимирование skinned мешей. |
batching | Время, затраченное на батчинг геометрии. Батчинг динамической геометрии существенно сильнее увеличивает нагрузку, нежели батчинг статичной геометрия. |
render | Время, затраченное на рендеринг видимых объектов. |
fixed-update-count | Минимальное и максимальное количество запущенных FixedUpdate во время этого кадра. Слишком много FixedUpdate заметно ухудшит производительность. |
Раздел mono-scripts предоставляет детальный разбор времени, затраченного на исполнение кода в Mono:
update | Общее время, затраченное на исполнение в скриптах всех функций Update(). |
fixedUpdate | Общее время, затраченное на исполнение в скриптах всех функций FixedUpdate(). |
coroutines | Время, затраченное внутри скриптовых сопрограмм. |
Раздел mono-memory даёт представление о том, как память управляется сборщиком мусора Mono:
allocated heap | Общее количество памяти, доступное для выделения. Сборка мусора будет вызвана, если для данного выделения в куче будет недостаточно памяти. Если памяти всё ещё будет не хватать, даже после сборки мусора, то тогда выделенная куча увеличится в размере. |
used heap | Размер выделенной кучи (allocated heap), которая в данный момент используется объектами. Каждый раз, когда вы создаёте новый экземпляр класса (не структуры), это значение будет расти до следующей сборки мусора. |
max number of collections | Количество проходов сборки мусора во время последних 30-ти кадров. |
collection total duration | Общее время (в милисекундах), затраченное на все проходы сборки мусора, что произошли за последние 30 кадров. |
В iOS по умолчанию профайлер выключен, так что, чтобы включить, вам понадобится открыть сгенерированный в Unity проект XCode, выбрать файл iPhone_Profiler.h
и изменить строку
#define ENABLE_INTERNAL_PROFILER 0
на
#define ENABLE_INTERNAL_PROFILER 1
Выберите в меню XCode View > Debug Area > Activate Console, чтобы отображать консоль выходной информации (GDB), а затем запустите ваш проект. Unity будет выдавать статистику в окно консоли каждые 30 кадров.
На Android профайлер по умолчанию включён. Просто при сборке убедитесь, что в меню Player Settings включён флажок Development Build, и тогда, при запуске на устройстве, статистика будет появляться в Logcat. Чтобы просмотреть logcat, вам понадобится adb
(Android Debug Bridge). Как только у вас он будет, просто запустите командную оболочку adb logcat
.