1 added
1 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Такой инструмент, как Unity-профайлер, облегчает оптимизацию игры и предоставляет конкретные данные о её производительности. Вы можете получить покадровые показатели, посредством которых выявить проблемные места гораздо легче. Кроме того, профайлер предоставляет информацию об игровой производительности вне редактора.</p>
1
<p>Такой инструмент, как Unity-профайлер, облегчает оптимизацию игры и предоставляет конкретные данные о её производительности. Вы можете получить покадровые показатели, посредством которых выявить проблемные места гораздо легче. Кроме того, профайлер предоставляет информацию об игровой производительности вне редактора.</p>
2
<p>Инструмент, безусловно, полезный, однако нужно учитывать, что его применение частично сказывается на производительности игры. И, чтобы повысить точность показателей производительности, следует создать билд для нужной платформы, а потом запустить вашу игру на целевом устройстве.</p>
2
<p>Инструмент, безусловно, полезный, однако нужно учитывать, что его применение частично сказывается на производительности игры. И, чтобы повысить точность показателей производительности, следует создать билд для нужной платформы, а потом запустить вашу игру на целевом устройстве.</p>
3
<p>Если мы хотим активировать профайлер в приложении, следует в окне Build Settings (File→Build Settings) включить параметры<strong>Autoconnect Profiler</strong>и<strong>Development Build</strong>. После запуска приложения профайлер станет запускаться автоматически. Вдобавок к этому, вы можете подключить профайлер в<strong>Profiler Controls</strong>, используя выпадающий список в редакторе.</p>
3
<p>Если мы хотим активировать профайлер в приложении, следует в окне Build Settings (File→Build Settings) включить параметры<strong>Autoconnect Profiler</strong>и<strong>Development Build</strong>. После запуска приложения профайлер станет запускаться автоматически. Вдобавок к этому, вы можете подключить профайлер в<strong>Profiler Controls</strong>, используя выпадающий список в редакторе.</p>
4
<p>Итак, профайлер предоставит нам информацию о том, сколько времени нужно приложению на рендер каждого кадра, разбив это на память, рендер, работу процессора, физику, аудио, сеть и UI. Однако тут важно заметить, что не стоит сравнивать показания профайлеров разных Unity-версий. Дело в том, что различные архитектуры профайлеров отображают показания по-разному.</p>
4
<p>Итак, профайлер предоставит нам информацию о том, сколько времени нужно приложению на рендер каждого кадра, разбив это на память, рендер, работу процессора, физику, аудио, сеть и UI. Однако тут важно заметить, что не стоит сравнивать показания профайлеров разных Unity-версий. Дело в том, что различные архитектуры профайлеров отображают показания по-разному.</p>
5
<h2>Выполняем профилирование в редакторе</h2>
5
<h2>Выполняем профилирование в редакторе</h2>
6
<p>Нельзя забывать о подводных камнях профилирования в редакторе. Например, большое количество открытых окон может привести к тому, что начнут проскакивать лаги. Мало того, даже рендер в самом редакторе порой даёт о себе знать. Именно поэтому очень важно хотя бы время от времени профилировать ваше приложение на целевом устройстве, не полагаясь лишь на данные из редактора.</p>
6
<p>Нельзя забывать о подводных камнях профилирования в редакторе. Например, большое количество открытых окон может привести к тому, что начнут проскакивать лаги. Мало того, даже рендер в самом редакторе порой даёт о себе знать. Именно поэтому очень важно хотя бы время от времени профилировать ваше приложение на целевом устройстве, не полагаясь лишь на данные из редактора.</p>
7
<h2>Deep Profile</h2>
7
<h2>Deep Profile</h2>
8
<p>Это режим, в котором происходит отдельная запись вызовов каждого метода, в результате чего обеспечивается чёткое представление дерева методов. Тут следует вспомнить, что, начиная с Unity версии 2017.3, режим<strong>Deep Profile</strong>работает не только в редакторе, но также на Android и Desktop с применением бэкенда Mono.</p>
8
<p>Это режим, в котором происходит отдельная запись вызовов каждого метода, в результате чего обеспечивается чёткое представление дерева методов. Тут следует вспомнить, что, начиная с Unity версии 2017.3, режим<strong>Deep Profile</strong>работает не только в редакторе, но также на Android и Desktop с применением бэкенда Mono.</p>
9
<p>Чтобы включить режим Deep Profile, задействуйте такой аргумент командной строки, как -deepprofiling. А если хотите включить данный режим на Android, вам подойдёт аргумент adb.</p>
9
<p>Чтобы включить режим Deep Profile, задействуйте такой аргумент командной строки, как -deepprofiling. А если хотите включить данный режим на Android, вам подойдёт аргумент adb.</p>
10
<p>К примеру:</p>
10
<p>К примеру:</p>
11
~$ adb shell am start -n com.company.game/com.unity3d.player.UnityPlayerActivity -e 'unity' '-deepprofiling'<h2>Профилируем память в редакторе</h2>
11
~$ adb shell am start -n com.company.game/com.unity3d.player.UnityPlayerActivity -e 'unity' '-deepprofiling'<h2>Профилируем память в редакторе</h2>
12
<p>Процесс профилирования памяти в редакторе полезен для понимания общей модели памяти, однако малополезен для фактических показателей конкретных устройств. Здесь нужно отметить следующее: - во время выполнения у каждого<a>меша</a>флаг<strong>read/write</strong>установлен вне зависимости от значения Read/Write Enabled в настройках импорта ассета. В результате удваивается память мешей, отображаемая в профайлере; - процесс профилирования в редакторе отключает сжатие вершин (<a>Vertex Compression</a>); - при выполнении приложения в редакторе формируется больше временных данных в памяти. Тот же<a>GetComponent</a>при отсутствии компонента выделит под него временную память. В итоге Unity может выбросить исключение в редакторе, не сделав это в билде.</p>
12
<p>Процесс профилирования памяти в редакторе полезен для понимания общей модели памяти, однако малополезен для фактических показателей конкретных устройств. Здесь нужно отметить следующее: - во время выполнения у каждого<a>меша</a>флаг<strong>read/write</strong>установлен вне зависимости от значения Read/Write Enabled в настройках импорта ассета. В результате удваивается память мешей, отображаемая в профайлере; - процесс профилирования в редакторе отключает сжатие вершин (<a>Vertex Compression</a>); - при выполнении приложения в редакторе формируется больше временных данных в памяти. Тот же<a>GetComponent</a>при отсутствии компонента выделит под него временную память. В итоге Unity может выбросить исключение в редакторе, не сделав это в билде.</p>
13
<h2>Статистика рендера</h2>
13
<h2>Статистика рендера</h2>
14
<p>В Unity существует функция отображения статистики рендера в режиме реального времени (окно Game). Туда включены батчи draw calls, fps, применение VRAM, число вершин и треугольников. Чтобы включить слой статистики, нажмите на кнопку<strong>Stats</strong>, которая расположена на панели окна Game. Данная статистика поможет вам анализировать<a>батчинг</a>и GPU-производительность на основе количества вызовов отрисовки.</p>
14
<p>В Unity существует функция отображения статистики рендера в режиме реального времени (окно Game). Туда включены батчи draw calls, fps, применение VRAM, число вершин и треугольников. Чтобы включить слой статистики, нажмите на кнопку<strong>Stats</strong>, которая расположена на панели окна Game. Данная статистика поможет вам анализировать<a>батчинг</a>и GPU-производительность на основе количества вызовов отрисовки.</p>
15
<p><em>Статистика в окне Game</em>:</p>
15
<p><em>Статистика в окне Game</em>:</p>
16
<p>Если нужна более детальная статистика рендера по каждому кадру, откройте вкладку рендера в профайлере:</p>
16
<p>Если нужна более детальная статистика рендера по каждому кадру, откройте вкладку рендера в профайлере:</p>
17
<p>На картинке выше заметно, что пустая сцена имеет пять вызовов SetPass и пять вызовов отрисовки.</p>
17
<p>На картинке выше заметно, что пустая сцена имеет пять вызовов SetPass и пять вызовов отрисовки.</p>
18
-
<p>На что тут следует обратить внимание: - число вызовов<strong>SetPass</strong>имеет важную роль, ведь оно плохо влияет на производительность. И число данных вызовов должно быть как можно меньше; -<strong>Draw calls</strong>(вызов�� отрисовки) - параметр менее важный, если приложение не зависит от производительности процессора. Связано это с тем, что вызовы отрисовки выполняются в рендеринговом потоке, запускаемом на процессоре. Для снижения зависимости от производительности процессора можно использовать<a>многопоточный рендеринг</a>.</p>
18
+
<p>На что тут следует обратить внимание: - число вызовов<strong>SetPass</strong>имеет важную роль, ведь оно плохо влияет на производительность. И число данных вызовов должно быть как можно меньше; -<strong>Draw calls</strong>(вызовы отрисовки) - параметр менее важный, если приложение не зависит от производительности процессора. Связано это с тем, что вызовы отрисовки выполняются в рендеринговом потоке, запускаемом на процессоре. Для снижения зависимости от производительности процессора можно использовать<a>многопоточный рендеринг</a>.</p>
19
<h2>Вызовы отрисовки</h2>
19
<h2>Вызовы отрисовки</h2>
20
<p>Если говорить о частых вызовах отрисовки с похожими пайплайнами, то они влияют на производительность лучше, чем редкие вызовы с разными пайплайнами. При этом Unity кеширует одинаковые вызовы, в результате чего процесс отрисовки ускоряется. И Unity создаёт разные буферы для разных вызовов, что загружает графическую память.</p>
20
<p>Если говорить о частых вызовах отрисовки с похожими пайплайнами, то они влияют на производительность лучше, чем редкие вызовы с разными пайплайнами. При этом Unity кеширует одинаковые вызовы, в результате чего процесс отрисовки ускоряется. И Unity создаёт разные буферы для разных вызовов, что загружает графическую память.</p>
21
<h2>Graphics Jobs и многопоточный рендер</h2>
21
<h2>Graphics Jobs и многопоточный рендер</h2>
22
<p>Graphics Jobs (Player Settings) и многопоточный рендер в большинстве случаев позитивно влияют на производительность, однако в процессе отладки и профилирования ряд показателей может быть "размытым". Если интересует более точное профилирование, вам будет полезно глянуть на<a>оптимизацию графики в Unity</a>.</p>
22
<p>Graphics Jobs (Player Settings) и многопоточный рендер в большинстве случаев позитивно влияют на производительность, однако в процессе отладки и профилирования ряд показателей может быть "размытым". Если интересует более точное профилирование, вам будет полезно глянуть на<a>оптимизацию графики в Unity</a>.</p>
23
<h2>Кадровый отладчик</h2>
23
<h2>Кадровый отладчик</h2>
24
<p>Остановить процесс игры на конкретном кадре и пройтись по основным событиям позволяет<strong>кадровый отладчик</strong>. Посредством его вы сможете проверить, каким образом Unity выстраивает сцену, что позволит вам прикинуть возможные способы оптимизации. Кроме того, отладчик указывает на те GameObject’ы, рендер которых необязателен. В принципе, вы можете отключить эти GameObject’ы, уменьшив количество вызовов отрисовки на один кадр.</p>
24
<p>Остановить процесс игры на конкретном кадре и пройтись по основным событиям позволяет<strong>кадровый отладчик</strong>. Посредством его вы сможете проверить, каким образом Unity выстраивает сцену, что позволит вам прикинуть возможные способы оптимизации. Кроме того, отладчик указывает на те GameObject’ы, рендер которых необязателен. В принципе, вы можете отключить эти GameObject’ы, уменьшив количество вызовов отрисовки на один кадр.</p>
25
<p>Кадровый отладчик не показывает отдельные вызовы отрисовки, как не показывает он и разницу между ними. Зато он показывает сам процесс построения кадра. Лишь нативные GPU-профайлеры дают подробную информацию о вызовах отрисовки (как правило, привязанную ко времени). Ещё отладчик будет полезен при отладке пайплайна и батчинга (в особенности, если вы работаете с Unity UI). Впрочем, подробную информацию лучше смотреть в<a>документации</a>.</p>
25
<p>Кадровый отладчик не показывает отдельные вызовы отрисовки, как не показывает он и разницу между ними. Зато он показывает сам процесс построения кадра. Лишь нативные GPU-профайлеры дают подробную информацию о вызовах отрисовки (как правило, привязанную ко времени). Ещё отладчик будет полезен при отладке пайплайна и батчинга (в особенности, если вы работаете с Unity UI). Впрочем, подробную информацию лучше смотреть в<a>документации</a>.</p>
26
<h2>Профайлер памяти</h2>
26
<h2>Профайлер памяти</h2>
27
<p>Вот<a>пример проекта</a>, где демонстрируется применение<a>профайлера памяти</a>. Кстати, по нему тоже есть прекрасная<a>документация</a>. Ниже представлен<strong>снимок с профайлера памяти</strong>:</p>
27
<p>Вот<a>пример проекта</a>, где демонстрируется применение<a>профайлера памяти</a>. Кстати, по нему тоже есть прекрасная<a>документация</a>. Ниже представлен<strong>снимок с профайлера памяти</strong>:</p>
28
<p>Этот инструмент отслеживает память, которая выделена подсистемами Unity и пользовательскими скриптами (до версии 2017.3). При этом профайлер не способен отслеживать выделение памяти из сторонних инструментов. Зато, начиная с Unity 2017.3, профайлер поддерживает отслеживание управляемых объектов в среде выполнения<strong>Mono scripting</strong>.</p>
28
<p>Этот инструмент отслеживает память, которая выделена подсистемами Unity и пользовательскими скриптами (до версии 2017.3). При этом профайлер не способен отслеживать выделение памяти из сторонних инструментов. Зато, начиная с Unity 2017.3, профайлер поддерживает отслеживание управляемых объектов в среде выполнения<strong>Mono scripting</strong>.</p>
29
<p>Подробнее о профайлере смотрите в<a>официальной документации</a>. Кстати, есть и толковое<a>видео</a>.</p>
29
<p>Подробнее о профайлере смотрите в<a>официальной документации</a>. Кстати, есть и толковое<a>видео</a>.</p>
30
<p><a>Источник</a></p>
30
<p><a>Источник</a></p>
31
31