Control replay parsing performance with different parse modes
Parse types allow you to balance between parsing speed and data completeness. Different modes control which parts of the replay are processed, letting you optimize for your specific use case.
The ParseType enum defines five parsing modes, each building upon the previous level:
public enum ParseType{ EventsOnly, // Parses only events Minimal, // Parses events and initial game state Normal, // Parses events and full game state Full, // Parses everything currently handled Debug // Parses everything + debugging information}
Defined in Unreal.Core/Models/Enums/ParseType.cs:3-25.
Use Case: Events plus basic game state information
var replay = reader.ReadReplay("match.replay", ParseType.Minimal);// Available data:// - Everything from EventsOnly// - replay.GameInformation.GameState// - replay.GameInformation.PlayerStates// - Supply drops and llamas
The ContinueParsingChannel() method in FortniteReplayReader.cs:200-220 controls which actors are fully parsed:
protected override bool ContinueParsingChannel(INetFieldExportGroup exportGroup){ switch (exportGroup) { // Always fully parse these case SupplyDropLlamaC _: case SupplyDropC _: case SafeZoneIndicatorC _: case FortPoiManager _: case GameStateC _: return true; } switch (ParseType) { case ParseType.Minimal: return false; // Stop parsing other channels default: return true; }}
Certain actors (game state, supply drops, safe zones) are always fully parsed regardless of parse type because they’re critical for understanding match context.
Use Case: Complete match replay with player tracking
var replay = reader.ReadReplay("match.replay", ParseType.Normal);// Available data:// - Everything from Minimal// - Player positions throughout the match// - Floor loot spawns and pickups
What’s Parsed:
All events
All ReplayData chunks fully processed
Player pawn updates (positions/rotations)
Floor loot pickups
Continuous player tracking
What’s Still Conditional:Some features can be disabled even in Normal mode via FortniteReplaySettings:
var settings = new FortniteReplaySettings{ IgnoreFloorLoot = true, // Skip floor loot even in Normal mode IgnoreShots = true, // Skip batched damage events IgnoreInventory = true, // Skip inventory updates IgnoreHealth = true, // Skip health updates IgnoreContainers = true // Skip container interactions};var reader = new ReplayReader(settings: settings);var replay = reader.ReadReplay("match.replay", ParseType.Normal);
See the conditionals in OnExportRead() at FortniteReplayReader.cs:134-197:
case PlayerPawnC playerPawn: if (ParseType >= ParseType.Normal) { Replay.GameInformation.UpdatePlayerPawn(channel, playerPawn); } break;case FortPickup fortPickup: if (ParseType >= ParseType.Normal) { if (!_fortniteSettings.IgnoreFloorLoot) { Replay.GameInformation.UpdateFortPickup(channel, fortPickup); } } break;
// Use Minimal for game state without heavy processingvar replay = reader.ReadReplay("match.replay", ParseType.Minimal);Console.WriteLine($"Map: {replay.GameInformation.GameState?.MapName}");Console.WriteLine($"Players: {replay.GameInformation.PlayerStates.Count}");Console.WriteLine($"Winner: {replay.GameInformation.GetWinner()?.PlayerName}");
// Use Normal for complete player trackingvar settings = new FortniteReplaySettings{ IgnoreFloorLoot = true // Skip loot if not needed};var reader = new ReplayReader(settings: settings);var replay = reader.ReadReplay("match.replay", ParseType.Normal);// Track player positions over timeforeach (var playerState in replay.GameInformation.PlayerStates){ var positions = replay.GameInformation.GetPlayerPositions(playerState.Key); Console.WriteLine($"{playerState.Value.PlayerName} moved {CalculateDistance(positions)}m");}