Если коротко:

Unreal Insights записывает события движка и помогает найти CPU-задачу или поток, растянувшие конкретный VR-кадр. В Timing Insights нужно сопоставить всплеск с Game, Render и RHI threads, затем изменить одну причину и повторить тот же тест. Инструмент не заменяет GPU-профилировщик: графические проходы и загрузку видеокарты исследуют отдельно.

Unreal Insights VR profiling помогает записать события движка и увидеть, какой поток или задача растянули конкретный кадр. Для VR это важнее среднего FPS: одиночные всплески нарушают равномерность движения головы даже тогда, когда среднее значение выглядит приемлемо.

Unreal Insights собирает trace events, сохраняет их через Trace Server или в файл и показывает временную шкалу в Timing Insights. Инструмент отвечает прежде всего на вопрос «что происходило на CPU и когда». Для детального анализа графических проходов нужен GPU-профайлер; эти задачи не стоит смешивать.

Сначала определите бюджет кадра

Бюджет зависит от частоты вывода:

Частота Время одного кадра
72 Гц около 13,9 мс
80 Гц 12,5 мс
90 Гц около 11,1 мс
120 Гц около 8,3 мс

Это общий предел для всей цепочки, а не разрешение потратить каждую миллисекунду на Game Thread. Нужен запас на вариативность, фоновые задачи, runtime и тепловые изменения устройства.

Что показывает Unreal Insights

  • Game Thread и вызовы игровой логики;
  • Render Thread и подготовку команд рендера;
  • RHI Thread, если он используется;
  • Task Graph и фоновые задачи;
  • загрузку ассетов;
  • работу памяти при включённых каналах;
  • bookmarks и пользовательские события;
  • отдельные GPU timing events при доступной трассировке, но не полный разбор кадра.

Epic описывает Unreal Insights как набор для захвата и анализа телеметрии. Трасса хранится в .utrace, а интерфейс позволяет перейти от медленного кадра к конкретному таймеру и его вызывающей цепочке.

Почему профилировать нужно на целевом устройстве

Play in Editor добавляет редактор, другой runtime и мощность настольного ПК. Для автономной гарнитуры важны мобильные ядра, память и реальная сборка Android. Для PC VR важны реальный путь запуска, runtime и настройки рендера.

Сначала воспроизведите проблему в Development build на целевом устройстве. Shipping-конфигурация ближе к релизу, но может ограничивать часть диагностических возможностей; выбор зависит от задачи и настроек проекта.

Подготовьте воспроизводимый тест

Запишите:

  • версию билда;
  • карту и точку старта;
  • модель гарнитуры;
  • частоту обновления;
  • разрешение и масштаб;
  • активные функции рендера;
  • длительность теста;
  • действие, вызывающее всплеск.

Трасса бесцельного перемещения по уровню создаёт много данных и мало ответа. Лучше записать короткий сценарий: загрузка меню, появление группы объектов, открытие двери или повторяемый бой.

Запуск трассировки

В современных версиях Unreal Engine Insights можно открыть из Trace/Insights в нижней панели редактора или запустить отдельный UnrealInsights из каталога бинарных файлов движка. Конкретный интерфейс зависит от версии.

Для локального приложения выберите необходимые каналы и начните trace. Для устройства укажите способ передачи на Trace Server или запись в файл согласно документации платформы. Проверьте сетевую доступность ПК и гарнитуры, если трасса отправляется по сети.

Не включайте все каналы без необходимости. Дополнительная телеметрия создаёт нагрузку и увеличивает файл. Начните с CPU, frame, bookmarks и нужных подсистем, затем расширяйте запись.

Как отметить проблемный момент

Добавьте bookmark перед воспроизводимым действием или используйте понятное событие в коде. Например, OpenInventory_Start, SpawnWave_03 или LevelStream_Request.

Хорошая метка отвечает, что произошло, а не кто написал код. Она экономит время поиска на длинной шкале и позволяет сравнивать две версии билда.

Чтение Timing Insights

  1. Найдите участок с длинным кадром.
  2. Сравните Game, Render и RHI threads.
  3. Раскройте самый длинный timing event.
  4. Перейдите к дочерним событиям.
  5. Посмотрите Callers/Callees и агрегированную статистику.
  6. Сравните всплеск с соседними нормальными кадрами.

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

Game Thread

Если ограничение находится на Game Thread, проверьте:

  • тяжёлые Tick-функции;
  • Blueprint-логику, вызываемую каждый кадр;
  • массовый spawn или destroy;
  • поиск объектов в сцене;
  • физику и столкновения;
  • анимацию и IK;
  • синхронную загрузку ассетов;
  • создание интерфейса.

Оптимизация начинается с конкретного timer event. Переписывать все Blueprints в C++ без измерения — дорогой способ не попасть в причину.

Render Thread и RHI Thread

Длинный Render Thread указывает на стоимость подготовки рендера: количество объектов, изменения состояния, создание ресурсов или работу с компонентами сцены. RHI Thread связан с передачей команд графическому API.

Это ещё не полный ответ о GPU. CPU может быстро подготовить тяжёлый графический кадр, который затем долго выполняется видеочипом. Для такого случая нужна отдельная GPU-проверка.

Task Graph

Фоновая задача не всегда бесплатна. Game Thread может ждать её завершения на sync point. В трассе это выглядит как простой одного потока рядом с долгой задачей другого.

Проверьте зависимости и момент ожидания. Иногда полезнее перенести работу раньше или разбить её на части, чем просто создать ещё один async task.

Загрузка ассетов

Первое появление объекта может вызвать загрузку текстуры, меша, анимации или компиляцию. Отмечайте, повторяется ли всплеск во второй попытке.

Варианты исправления:

  • предзагрузка до интерактивной сцены;
  • асинхронная загрузка;
  • уменьшение и разбиение ассета;
  • управляемый level streaming;
  • прогрев нужных ресурсов;
  • устранение случайной ссылки, которая тянет крупный пакет.

Пользовательские события

Если стандартные таймеры слишком крупные, добавьте именованные scope events в C++ или подходящие profiler events для Blueprint. Не размечайте каждую строку. Выбирайте границы систем: обновление инвентаря, расчёт хвата, поиск цели, подготовка волны.

Названия должны сохраняться между версиями, иначе сравнение трасс превратится в ручное сопоставление.

Как подтвердить исправление

  1. Сохраните исходную трассу.
  2. Измените одну систему.
  3. Соберите ту же конфигурацию.
  4. Повторите тот же сценарий на том же устройстве.
  5. Сравните не один кадр, а распределение и повторяемость всплесков.
  6. Проверьте, не переехала ли нагрузка на другой поток.

Уменьшение одного timer event не считается успехом, если вырос GPU time или появились пропуски в другом месте.

Частые ошибки профилирования

  • измерять только средний FPS;
  • профилировать редактор вместо устройства;
  • менять сразу несколько настроек;
  • записывать слишком длинную сессию без bookmarks;
  • включать все trace channels;
  • считать корреляцию причиной;
  • сравнивать разные карты, частоты или версии контента;
  • оптимизировать систему, которая не ограничивает кадр.

Общий чек-лист перед сборкой есть в статье о тестировании VR-приложения.

CPU или GPU

Простой ориентир:

  • длинный Game/Render/RHI event в трассе — изучайте CPU-цепочку;
  • CPU укладывается, но кадр всё равно поздний — проверяйте GPU и runtime;
  • всплеск совпадает с загрузкой — изучайте assets и streaming;
  • периодический ровный провал — ищите таймер, сбор данных или пакетную задачу.

Unreal Insights нужен не для общего «ускорения проекта», а для доказательства конкретной причины. Короткая воспроизводимая трасса, метка события и повторный тест дают больше, чем десятки несвязанных графиков.

Поделиться:TelegramВКонтакте

Источники

  1. Epic Games — Unreal Insights
  2. Epic Games — Timing Insights
  3. Epic Games — Introduction to Performance Profiling
  4. Meta — Get Started With Unreal Insights on Quest