(Q2) Re load time and analysis memory
Analysis-side memory runs roughly 10x the .utrace file size (a ~1 GB CPU-only trace costs on the order of 10 GB of RAM to analyze). Treat that as a rule of thumb, not a guarantee. It’s useful in two directions -- if your measurements land near it, you’re hitting the known structural limit and file size is the lever; if they’re far worse, that’s a bug we’d like to see. In older Unreal Insights versions there were some memory leaks. The most important fixes were done in UE 5.7. So, one recommendation is to use latest version of Unreal Insights (ex. from UE 5.8) even if you record and analyze traces from UE 5.3 (Unreal Insights is backward compatible).
The honest answer is that this is a known structural limit. We have long term plans for the following directions:
- Today, opening a trace re-parses the byte utrace stream from scratch every time and materializes the analyzed data into in-memory providers; nothing is persisted between sessions (except the ucache for resolved symbols). Future possible improvement: to cache/persist some analyzed data.
- Filtering at analysis time, before events reach the providers. A configurable pre-filter at the analyzer boundary — drop events you don’t care about during analysis rather than storing them — can be the cheapest architectural win available and is well-suited to a licensee branch, because it’s additive and doesn’t change the file format. It also converges naturally with content-aware trim filtering.
- Paging analyzed data out of RAM rather than holding all providers resident. This involves more complex integration work with existing analyzers/providers.
- Indexing, to enable partial and lazy loading.
Note that we do not have any ETA for above (if/when these would land in a UE release). If you are going to invest engineering effort on the analysis side, you can develop on these directions.
Practical optimization approaches are mostly the ones described at point 1: reducing trace data --> smaller utrace files --> faster analysis.
Using TraceTrimmer (UE 5.8) --> extract a smaller trace from a larger trace --> open only the small trace in Unreal Insights for fast analysis.
(Q3) What landed in 5.4+ — and what’s worth backporting (relevant changes by release)
- UE 5.4: TraceAnalyzer standalone tool (Engine/Source/Programs/TraceAnalyzer)
- UE 5.5: “memory_light” preset; counter API extensions (unchecked/atomic -- cheaper counter emission); export Counter commands
- UE 5.6: Block-pool hard cap (~80 MB) + UE_TRACE_BLOCK_SIZE / UE_TRACE_WRITER_SLEEP_MS -- also fixed out-of-order serial events under extreme load; CpuProfilerTrace FName variants + EventBatchV3; relay endpoints (supply custom open/write/close functions for trace output — the clean hook if you want your own transport or compression);
- UE 5.7: Sampling Profiler (experimental; -samplinginterval=, default 125 µs); Direct Trace mode (-ListenForDirectTrace, bypasses the trace store); frontend memory-stats debug display and mem leak fixes
- UE 5.8: TraceTrimmer + in-UI “Trim and Save As”; FTraceWriter (a new API that allows you to write new traces; it lives in TraceAnalysis module); compressed callstacks; TraceQuery (reads.utrace, emits JSONL to stdout --scripted analysis with no editor and no Insights app); MemoryInsights.ExportAllocs; minimal-trace support (i.e. trace support in shipping builds)
+ lots of new features, usability improvements and bug fixes in Unreal Insights --> you can benefit of them immediately, just by using latest version
(Q4) Design constraints and common pitfalls
When investigating cpu/gpu performance, keep tracing as light as possible. Any new trace channel enabled would add some runtime overhead (both performance and memory overhead). Some channels are more heavy than others from this p.o.v. For example, enabling the “memory” preset -- and especially the “callstack” channel - adds a significant perf overhead. If memory channel is enabled, the analyzed “cpu” perf data would need to be read with a grain of salt.
If your investigation goal is to measure memory, then it is ok to also have cpu enabled in the same time (as in general, in this case it does not matter if the game runs slower -- you aim would be to capture memory data and to correlate what/when something allocates with what is running; but overall cpu performance would be irrelevant in that case).
Event filtering has dependency edges, and naive name-based filtering (i.e. using TraceTrimmer) produces traces that analyze cleanly but read wrong. Example of known couplings: “callstack” needs “module” for symbol resolution.
Never make a high-volume event “important.” Important events are cached in memory for the lifetime of the process so they can be replayed on connect. Adding per-instance data to that path grows runtime memory without bound.
Channels may get enabled behind your back. GameplayInsights/Rewind Debugger toggles Object on PIE start and ObjectProperties/Animation/Frame when recording; -NetTrace=1 enables Net+Frame; VisualLogger, TraceSourceFiltering, NetworkPrediction and PoseSearch each enable their own when active. “We only enabled cpu” is often not what’s happening — confirm with Trace.Status.
Format compatibility cuts both ways. The trace protocol is versioned (v7 in 5.2) and we also version some of the trace loggers / events (ex. EventBatchV3 added in 5.6). The latest UnrealInsights from a UE stream generally reads older traces. If you modify the trace format (trace protocol), you lose both directions: your traces stop opening in official Unreal Insights, and official traces stop opening in yours. Strong recommendation: Prefer additive and config-driven changes (rather than touching the trace transport implementation), and prefer standalone tools and Insights plugins over edits inside TraceServices providers; the latter is where your merge debt will accumulate fastest.
Unreal Insights is deliberately targeted at deep technical experts — that’s a settled design position, not an oversight, and it explains the tool’s bias toward power over approachability. If part of what you’re chasing is “make this usable by more of the team,” expect the tool to meet you only partway, and consider whether a narrower purpose-built view over the same trace data serves you better than trying to soften the general tool.
Best regards,
Ionut