Как профилировать FPS, CPU, GPU и memory в Unreal Insights?
Запустите игру с -trace=cpu,gpu,frame,memory, откройте файл .utrace в UnrealInsights.exe. Timing Insights показывает CPU-треды (GameThread, RenderThread) и GPU passes с детализацией до отдельных функций через TRACE_CPUPROFILER_EVENT_SCOPE.
Профилирование в Unreal Insights
Unreal Insights — отдельное приложение (Engine/Binaries/Win64/UnrealInsights.exe) для анализа производительности UE-приложений. Оно принимает трейс-данные по UDP в реальном времени или читает файлы .utrace.
Запуск трейсинга
# Через аргументы запуска игры:
MyGame.exe -trace=cpu,gpu,memory,frame,log,bookmark
# Подключение к уже запущенной игре:
# В консоли игры:
Trace.Start cpu,gpu,frame
Trace.File "C:/Traces/session.utrace"
Trace.Stop
# Запись в сеть (для мобильных устройств):
Trace.Start cpu,frame
Trace.SendTo 192.168.1.100 # IP машины с Insights
Анализ FPS и Frame Time
В Unreal Insights откройте вкладку Timing Insights. Верхняя дорожка — Frame timeline: каждый прямоугольник — один кадр. Цвет кодирует длительность: зелёный (<16ms), жёлтый (<33ms), красный (>33ms). Кликните на кадр для детализации.
CPU Profiling
CPU-дорожки разбиты по тредам: GameThread, RenderThread, RHIThread, AsyncThread. Каждая именованная область — это SCOPE_CYCLE_COUNTER или TRACE_CPUPROFILER_EVENT_SCOPE.
// Добавление собственной области в трейс:
#include "ProfilingDebugging/CpuProfilerTrace.h"
void UMyComponent::TickComponent(float DeltaTime, ...)
{
TRACE_CPUPROFILER_EVENT_SCOPE(UMyComponent::Tick);
// ... код ...
}
В Insights используйте Timers панель (F3) для сортировки по Inclusive/Exclusive Time и поиска самых дорогих функций.
GPU Profiling
GPU-дорожка появляется при трейс-канале gpu. Требует DirectX 11/12 или Vulkan с поддержкой GPU timestamps. Показывает GPU passes: ShadowDepths, BasePass, Translucency, PostProcess. Кликните по пассу для просмотра вложенных draw calls.
// GPU scope в C++:
RDG_GPU_STAT_SCOPE(GraphBuilder, MyCustomPass);
// или через SCOPED_GPU_STAT:
SCOPED_GPU_STAT(RHICmdList, MyRenderPass);
Memory Profiling
Канал memory записывает аллокации/деаллокации. Вкладка Memory Insights показывает timeline аллокаций, heap usage и live allocations. Для поиска утечек: отфильтруйте по тегу аллокатора (например, UObject) и найдите объекты, не удалённые GC.
# Включение LLM (Low Level Memory) тегов:
-LLM -LLMCSV="C:/llm_output.csv"
Bookmarks и Log
Добавляйте маркеры в код для навигации по трейсу:
#include "Misc/Trace/Detail/Trace.h"
Bookmark(TEXT("Level_Loaded"));
Они отображаются как вертикальные линии в Timing Insights — удобно для привязки событий к временной оси.
Подводные камни
- GPU трейс требует правильного RHI — на DX11 без Stable Power State (nvidia-smi -pm 1) GPU timestamps нестабильны. Используйте DX12 или Vulkan для точных данных.
- Трейс в Editor нерепрезентативен — Editor UI, PIE overhead и hotreload влияют на результаты. Профилируйте Packaged Build или Standalone.
- Слишком много каналов замедляет игру — канал
memoryособенно тяжёл: перехватывает все malloc/free. Включайте только нужные каналы. - GameThread != полный CPU — задачи в Task Graph могут выполняться на Worker Threads; смотрите все треды, а не только GameThread.
- Frame boundary — Insights измеряет Game Thread frame time, не включая GPU. GPU может быть behind на несколько кадров; учитывайте это при анализе.
- Файл .utrace не читается старой версией Insights — версии Insights и Engine должны совпадать.
Common mistakes
- Отвечать определением без production-сценария.
- Не называть runtime boundary, security boundary или failure mode.
- Игнорировать версию API, observability и тестовую проверку.
What the interviewer is testing
- Объясняет механизм своими словами и без выдуманных API.
- Называет реальные риски, диагностику и критерий корректности.
- Связывает ответ с текущей документацией и миграционными ограничениями.