12 августа 2022

🎮 Как с помощью Unreal Insights оптимизировать игру на Unreal Engine

UE4 C++ Developer. Currently working with Flying Wild Hog on the Space Punks title. Author of articles on C++, GameDev, Unreal Engine and general programming
Unreal Insights – это профайлер, доступный в UE из коробки. В данной статье мы разберём, как, пользуясь Unreal Insights, оптимизировать две основные метрики игры: время выполнения и потребление памяти.
🎮 Как с помощью Unreal Insights оптимизировать игру на Unreal Engine

Что ещё за Unreal Insights

Unreal Insights – это инструмент позволяющий разработчикам исследовать производительность их UE-приложений с точки зрения времени выполнения, времени загрузки ассетов, потребления памяти, сетевой производительности, производительности анимации и UI.

Как собрать и запустить Unreal Insights

При установке Unreal Engine через лаунчер Epic Games, уже собранный исполняемый файл Unreal Insights будет находиться по адресу <директория установки движка>/Engine/Binaries/Win64/UnrealInsights.exe

В случае если вы компилируете движок из исходников, то собрать Unreal Insights можно через соответствующий проект в solution:

Проект Unreal Insights в общем solution движка
Проект Unreal Insights в общем solution движка

Общие сведения о работе с Unreal Insights

Прежде всего стоит сказать, что профилирование происходит по каналам. Канал в данном случае представляет собой поток информации об определенной составляющей вашей игры. Например, канал CPU передаёт информацию об использовании процессора, канал GPU – об использовании видеокарты, Log – о сообщениях, выведенных в лог. Помимо этих трех каналов существуют также несколько других, полную информацию о которых можно найти в официальной документации.

Для того чтобы указать какие из каналов ваша игра будет посылать Unreal Insights и по какому IP-адресу запущен профайлер, необходимо запускать игру с дополнительными параметрами:

Параметры для включения профилирования
        -trace=cpu,gpu,loadtime,counters,log,frame,memory -llm -tracehost=127.0.0.1 -counterstrace
    

Здесь:

-trace – указывает список каналов данных, с которых необходимо снимать.
-llm – необходимо для канала memory.
-counterstrace – для счетчиков.
-tracehost – указывает IP-адрес машины, где запущен Unreal Insights.

Данные параметры включают профилирование по всем основным каналам и указывают игре, что Unreal Insights запущен на локальной машине. Доступно и удаленное профилирование.

Для того чтобы запустить проект с дополнительными параметрами перейдите в Editor Preferences и задайте необходимые параметры в Additional Launch Parameters. Убедитесь, что Unreal Insights уже запущен и после этого просто запустите проект в Standalone-режиме.

Установка дополнительных параметров запуска
Установка дополнительных параметров запуска

Когда проект будет запущен, в Unreal Insights появится строка с Live-сессией:

Live-сессия в Unreal Insights
Live-сессия в Unreal Insights

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

Результаты профилирования. Обратите внимание, что для Live-сессии данные будут обновляться в реальном времени
Результаты профилирования. Обратите внимание, что для Live-сессии данные будут обновляться в реальном времени
Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека C/C++ разработчика»

Профилирование времени выполнения с Unreal Insights

Откройте вкладку Timing Insights. Она состоит из нескольких панелей:

  • Панель кадров с диаграммой общего времени кадра в верхней части.
  • Панель таймингов, занимающая основную часть окна, показывает сколько времени было проведено внутри отдельного scope.
  • Панель с сообщениями лога в нижней части.
  • Панель таймеров и счетчиков справа.

Главная фича вкладки Timing Insights – это возможность выбрать отдельный кадр в панели кадров (например, подозрительно долгий кадр) и получить детальную информацию о том, что и как долго происходило на протяжении этого кадра. Для этого необходимо кликнуть на нужном кадре и Unreal Insights сам выделит нужную часть в панели таймингов:

Агрегация данных профилирования по промежутку времени
Агрегация данных профилирования по промежутку времени

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

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

Информация о timing-событии
Информация о timing-событии

Панель таймингов отображает данные по нескольким потокам (трекам) сразу. Чтобы включить или отключить отдельные треки, перейдите в меню Tracks в левой верхней части панели таймингов:

Выбор треков для отображения
Выбор треков для отображения

В панели таймеров будут отображены все события, произошедшие в выделенном промежутке времени, сгруппированные и отсортированные в соответствии с выбранными в этой же панели настройками:

Панель таймеров
Панель таймеров

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

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

Важная функция доступная в Timing Insights – это фокусировка панели таймингов на моменте, когда в лог было выведено определённое сообщение. Для этого всего лишь надо кликнуть на нужное сообщение в панели лога и курсор панели таймингов сам установится на необходимом моменте:

Панель логов – способ позиционировать курсор панели таймингов на моменте, когда в лог было выведено какое-либо сообщение
Панель логов – способ позиционировать курсор панели таймингов на моменте, когда в лог было выведено какое-либо сообщение

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

Макрос для включения профилирования отдельного фрагмента функции
        void UMyEnemy::ReloadWeapon()
{
    TRACE_CPUPROFILER_EVENT_SCOPE(TEXT("UMyEnemy::ReloadWeapon"))
    //payload code
}
    

Для добавления собственного счетчика в C++ файле необходимо задекларировать счетчик с помощью макроса TRACE_DECLARE_INT_COUNTER (или любого другого из этого семейства). Затем значение счетчика можно изменять используя макросы TRACE_COUNTER_SET, TRACE_COUNTER_INCREMENT и им подобные.

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

Демонстрация попеременного увеличения и уменьшения счетчика
Демонстрация попеременного увеличения и уменьшения счетчика

Полный список доступных макросов для работы со счетчиками можно найти в хедере ProfilingDebugging/CountersTrace.h.

Профилирование памяти с Unreal Insights

Откройте меню и поставьте галочку на Memory Insights. Откроется соответствующая вкладка:

Результаты профилирования памяти
Результаты профилирования памяти

Работа с данными профилирования памяти гораздо проще, чем с таймингами. На основной панели находятся графики потребления памяти различными частями игры/движка, например, Audio, Textures или Meshes с названиями, говорящими сами за себя. В верхней части находится трек Main Memory Graph, где отображается всё то же самое, но для эргономичности наложенное друг на друга.

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

Вывод

Unreal Insights – отличный инструмент для разработчика на Unreal Engine, который может дать несколько действительно ценных советов о том, что и где в вашей игре нуждается в оптимизации.

***

Материалы по теме

Комментарии

ВАКАНСИИ

Добавить вакансию
Разработчик C++
Москва, по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ