Unity iOS and Android contain a built-in profiler. The built-in profiler emits console messages from the game running on device. These messages are written every 30 frames and will provide insight into how the game is running. Understanding what these messages mean is not always easy, but as a minimum, you should quickly be able to determine if your game is CPU or GPU bound, and if CPU bound whether it’s script code, or perhaps Mono garbage collection that is slowing you down. See later in this page to learn how to configure the built-in profiler.
Вот пример выходной информации встроенного профайлера.
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 кадров.
Property: | Function: |
---|---|
cpu-player | Отображает время, которое ваша игра затрачивает на запуск кода внутри движка Unity и на запуск скриптов в процессоре. |
cpu-ogles-drv | Отображает время, затраченное на запуск кода OpenGL ES драйвера в процессоре. Много факторов, вроде количества вызовов отрисовки (Draw Calls), количества изменений внутреннего состояния рендеринга, настроек системы рендеринга и даже количества обработанных вершин, может повлиять на статистику драйвера. |
cpu-waits-gpu | Отображает время, которое CPU простаивает ожидая, пока GPU завершит рендеринг. Если это число превышает 2–3 милисекунды, то это значит, что в вашем приложении вызывает задержк, скорее всего GPU/fillrate. Если это значение будет слишком маленьким, то профайлер пропустит его отображение. |
msaa-resolve | The time taken to apply anti-aliasing. |
cpu-present | Количество времени, затраченное на запуск команды presentRenderbuffer в OpenGL ES. |
frametime | Демонстрирует общую длительность игрового кадра. Учтите, что iOS устройства всегда зафиксированы на частоте обновления 60 Гц, так что вы всегда будет получать результат равный 16.7 мс (1000ms/60Hz = 16.7ms). |
Property: | Function: |
---|---|
tris # | Общее количество треугольников, отправленных на рендеринг. |
verts # | Общее число вершин, отправленных на рендеринг. Вам следует сохранять это значение ниже 10000, если используете только статичную геометрию, но если у вас есть много skinned геометрии, то вам нужно сохранять его ещё более низким. |
batched | Количество вызовов отрисовки, треугольников и вершин, которые были автоматически подвержены батчингу (пакетная обработка) движком. Сравнение этих чисел с общим количеством вызовов отрисовки и треугольников даст вам представление о том, как хорошо ваша сцена подготовлена к батчингу. Распределите столько материалов, сколько возможно среди ваших объектов, чтобы улучшить батчинг. |
The player-detail section provides a detailed breakdown of what is happening inside the engine:
Property: | Function: |
---|---|
physx | Время, затраченное на физику. |
animation | Время, затраченное на анимирование костей. |
culling | Время, затраченное на отсечение объектов за пределами усечённого вида камеры. |
skinning | Время, затраченное на анимирование skinned мешей. |
batching | Время, затраченное на батчинг геометрии. Батчинг динамической геометрии существенно сильнее увеличивает нагрузку, нежели батчинг статичной геометрия. |
render | Время, затраченное на рендеринг видимых объектов. |
fixed-update-count | Минимальное и максимальное количество запущенных FixedUpdate во время этого кадра. Слишком много FixedUpdate заметно ухудшит производительность. |
Раздел mono-scripts предоставляет детальный разбор времени, затраченного на исполнение кода в Mono:
Property: | Function: |
---|---|
update | Общее время, затраченное на исполнение в скриптах всех функций Update(). |
fixedUpdate | Общее время, затраченное на исполнение в скриптах всех функций FixedUpdate(). |
coroutines | Время, затраченное внутри скриптовых сопрограмм. |
Раздел mono-memory даёт представление о том, как память управляется сборщиком мусора Mono:
Property: | Function: |
---|---|
allocated heap | Общее количество памяти, доступное для выделения. Сборка мусора будет вызвана, если для данного выделения в куче будет недостаточно памяти. Если памяти всё ещё будет не хватать, даже после сборки мусора, то тогда выделенная куча увеличится в размере. |
used heap | Размер выделенной кучи (allocated heap), которая в данный момент используется объектами. Каждый раз, когда вы создаёте новый экземпляр класса (не структуры), это значение будет расти до следующей сборки мусора. |
max number of collections | Количество проходов сборки мусора во время последних 30-ти кадров. |
collection total duration | Общее время (в милисекундах), затраченное на все проходы сборки мусора, что произошли за последние 30 кадров. |
On iOS, it’s disabled by default. To enable it, open the Unity-generated XCode project, select the InternalProfiler.h
file, and change the line
#define ENABLE_INTERNAL_PROFILER 0
на
#define ENABLE_INTERNAL_PROFILER 1
Выберите в меню XCode View > Debug Area > Activate Console, чтобы отображать консоль выходной информации (GDB), а затем запустите ваш проект. Unity будет выдавать статистику в окно консоли каждые 30 кадров.
To enable it on Android, click the Enable Internal Profiler (Deprecated) checkbox in the Player window (Edit > Project Settings, then select the Player category). Make sure Development Build is checked in the Build Settings when building, and the statistics should show up in logcat when run on the device. To view logcat, you need adb or the Android Debug Bridge. Once you have that, simply run the shell command adb logcat.