This page covers Timing Insights in Unreal Editor for Fortnite. If you are profiling an Unreal Engine project, see Timing Insights in Unreal Engine.
Timing Insights is a profiling tool in Unreal Editor for Fortnite (UEFN) that you use to analyze the runtime performance of your island and find opportunities to optimize it.
Timing Insights records a capture of your experience while it runs, then breaks that capture down frame by frame. You use it to answer two kinds of question:
Why did one specific frame take much longer than the frames around it?
Across many frames, which operations consistently cost the most time?
This page introduces the tool, explains each panel, and walks through both workflows.
Glossary
Term | Description |
timers | In Timing Insights, this is a section of code that is measured each time the section runs in a game, recording how long that section took to run. |
timing event | In Timing Insights, a timing event is the run of a single timer during a game capture. A capture produces multiple timing events, and each event has its own duration. |
callers | In a computer program, when an instruction is requested by the program, it is called. With Timing Insights, a timer can call another timer. A timer can have more than one caller if the code it calls runs in more than one place. Compare to callee. |
callees | In Timing Insights, when a timer is called by another timer, the timer that calls another timer is the caller, and the timer called is the callee. This is important because it shows the discrepancy between the duration of the event spent in the timer's own work vs the duration of responses to calls. |
hot path | The chain of events formed by taking the largest average duration included when the timer executes in a game frame at each level of a caller or callee tree. It accounts for the timer with the largest share of measured time in Timing Insights. |
parent | When two items are nested, the item higher on the hierarchy is the parent, and the item nested beneath it is the child. The parent is the first level above the referenced child, not the entire chain of items. |
Opening Timing Insights
You can open Timing Insights in two ways:
From the main menu, select Tools > Profile > Timing Insights.
From the Spatial Profiler:
Open the Spatial Profiler.
In the Metrics Tree View, select a metric under Frame Time.
Click Start Capture below the description.
Window Components
Timing Insights displays the following components by default:
Main Toolbar: Starts, stops, pauses, and resumes capturing. Also selects the profiling target and toggles panel visibility.
Frames panel: A graph of the frames in your session. Each bar is a frame, and the taller the bar, the more time that frame took. Game frames and rendering frames are shown in the same view, and either type can be toggled off.
Timing View panel: A view of the timing events in your capture. Time runs left to right, and each track contains many timing events from one source, usually a thread.
Time Ruler: A track at the top of the Timing View panel that maps horizontal screen space to session time. Use it to select a time range to aggregate statistics for.
Timers panel: Timers combined across the selected time range, with aggregated statistics for each.
Callees panel: For the selected timer and time range, a tree view of everything that timer called.
Callers panel: For the selected timer and time range, a tree view of everything that called that timer.
Capture a Session
The capture workflow depends on how you opened the tool.
If you opened Timing Insights from the Tools > Profile menu:
In the client, play your experience until you reach the part you want to profile.
In the Main Toolbar, click Start. When capturing starts, the button changes to Stop and the icon turns red and begins pulsing.
Return to the client and play your experience in a way that triggers the performance issue you want to investigate.
Click Stop to end the capture.
If you opened Timing Insights from the Spatial Profiler:
Capturing starts automatically when the window opens. Play the part of the game you want to investigate, then click Stop.
Capturing stops when you close the Timing Insights window, even if it is still running.
Inspect a Frame Spike
Use this workflow when one frame is noticeably slower than the frames around it.
In the Frames panel, zoom out until the whole capture fits, so the slow frames stand out.
Look for a bar much taller than the ones next to it. That is a hitch, and it is usually worth clicking first. Bars above the upper (red) threshold line are also worth investigating.
Click the tallest bar. The Timing View and Timers panels show that frame.
In the Timing View panel, find the widest timing event on each track. That is where the time went.
Select that timing event and press Enter to narrow the selected time range to it.
Read the Timers and Callees panels to see what the timing event was made of. Sort the Timers panel by Incl to rank the cost.
In the example above, the slow frame contains a GarbageCollection timing event, that operation is the likely source of the spike. Garbage collection releases memory that the application no longer needs, but it can take a significant amount of time.
Investigate Timer Statistics Across Many Frames
Use this workflow when you want to find operations that cost time consistently, rather than in one spike.
In the Timers panel, set Mode to Game Frame. The aggregation now reports statistics per frame for each timer.
In the Timing View panel, zoom out using the scrollbar until you can see a large number of frames.
Hold down the left mouse button and drag across the Time Ruler to select a time interval containing multiple frames. In Game Frame mode, the selection snaps to game frame boundaries. The selection triggers an aggregation in the Timers panel, where statistics are calculated for each timer in the selected range.
Read the aggregated columns.
Select a timer. With both a timer and a time range selected, the Callees panel populates with a tree view of everything the selected timer called, within the selected time range.
Column | Description |
C.Avg (Average Instance count) | The average number of times the timer appears in a game frame within the selected interval. |
I.Avg (Average Inclusive Time) | The average duration the timer executed in a game frame. |
Hover over any column header to see its description. Right-click the header to show more columns. Left-click a column header to sort by it.
Use the timer statistics to identify objects or settings in your experience that cause timers to run long.
Panel Reference
Frames Panel
The Frames panel shows a series of frame bars with the lower (green) and upper (red) threshold lines visible, and one clearly taller bar.
Each bar in the Frames panel is a frame. The taller the bar, the more time that frame took. When zoomed out, one bar represents several frames and shows the slowest of them. Game frames and rendering frames are shown in the same view, and either type can be toggled off.
Why it is useful
Your frames should be consistently under the lower (green) threshold line for best performance, and never above the upper (red) line. A bar much taller than the ones next to it is a hitch, and usually worth clicking first.
Example
Zoom out until the whole capture fits, so the slow frames stand out.
Click the tallest bar. The Timing View and Timers panels show that frame.
Sort by Incl in the Timers panel to see where its time went.
Timing View Panel
The Timing View panel shows multiple tracks, with a wide timing event on one track and narrower child timing events nested beneath it.
A timing event is one operation that ran, and its width is how much time it took. Time runs left to right, and each track contains many timing events from one source, usually a thread. A timing event displayed below another timing event is running in the scope of the parent timing event.
Why it is useful
The Timing View panel shows which timing events occurred in a frame. One wide timing event means a single expensive call. Many small timing events side by side mean the cost is spread out.
Use the Timers panel to view the ranked totals.
Example
Select a slow frame from the Frames panel.
Find the widest timing event on each track. That is where the time went.
Select that timing event and press Enter, then read the Timers and Callees panels to see what it was made of.
Timers Panel
The Timers panel is sorted by Incl descending, with the Mode setting visible.
Timers combine multiple timing events in the selected time range. You can sort them by inclusive (Incl) or exclusive (Excl) time duration. Incl is how much time a timer took, inclusive of its children. Excl is without its children.
Why it is useful
The Timers panel ranks the cost, so you can find the expensive work quickly. A timer with a big Incl and a small Excl means the time was spent in the children, so open the Callees panel. A big Excl means the time was spent in that timer, not in the children.
Example
Select a slow frame from the Frames panel.
Sort by Incl descending and read the top rows.
Big Incl with small Excl: open Callees to find the real cost. Big Excl: investigate that timer.
Callers Panel
The Callers panel shows a tree with the hot path expanded and the % Parent column visible.
The Callers panel shows a tree view of everything that called the timer selected in the Timers panel over the selected time range. The tree starts at the selected timer and branches into its callers, which branch into their callers, and so on. The hot path, which is the chain that follows the largest Incl at each level, is expanded for you.
Why it is useful
The Callers panel answers which callers are paying for that timer's cost, and how much each one contributes. If most of the time comes through one caller, improve it by calling it less often, for example. If it is spread across many, the timer itself should be made faster.
Example
Sort the Timers panel by Count and select a timer near the top.
Follow the hot path until % Parent drops significantly.
Improve the parent timer.
Callees Panel
The Callees panel showing a tree with the hot path expanded and the % Parent column visible.
The Callees panel shows a tree view of everything the timer selected in the Timers panel called, added up over the selected time range. The tree starts at the selected timer and branches into its children, which branch into their children, and so on. The hot path, which is the chain that follows the largest Incl at each level, is expanded for you.
Why it is useful
The Callees panel answers why a timer is expensive by splitting it into its parts. Following the hot path leads to the relevant timer. If a timer's children do not have a large % Parent, focus on the parent.
Example
Sort the Timers panel by Incl and select the timer at the top.
Follow the hot path until % Parent drops significantly.
Improve that timer.