FramePro Reader is a console application that reads FramePro (.framepro) profiling files and generates comprehensive performance analysis reports with a focus on multithreading optimization.
- Reads FramePro save files (.framepro format)
- Analyzes session metadata (frame count, timer frequency, thread information)
- Identifies hot functions with detailed performance metrics
- Groups functions by threads for multithreading analysis
- Generates frame-by-frame performance data
- Exports data in structured JSON format
dotnet run --project FrameProReader "path/to/your/file.framepro"- TotalTimeMs: Total execution time across all frames
- TotalCount: Total number of function calls
- AvgTimePerFrameMs: Average execution time per frame
- MaxTimePerFrameMs: Maximum execution time in any single frame
- AvgCountPerFrame: Average number of calls per frame
- MaxCountPerFrame: Maximum number of calls in any single frame
- ThreadId: Unique identifier for the thread
- ThreadName: Human-readable thread name
- ThreadUtilizationPercent: Percentage of thread utilization
- IsMainThread: Whether function runs on main thread (UI blocking)
- IsRenderThread: Whether function runs on render thread (FPS impact)
- IsWorkerThread: Whether function runs on worker thread (parallelizable)
The JSON files provide data to identify:
- Functions with high TotalTimeMs (optimization priority)
- Functions with high MaxTimePerFrameMs (cause frame drops)
- Functions with high ThreadUtilizationPercent (thread saturation)
- Functions on main thread (IsMainThread: true) blocking UI
- Functions on render thread (IsRenderThread: true) affecting FPS
- Overloaded threads (ThreadUtilizationPercent > 80%)
- Functions suitable for worker threads (IsWorkerThread: true)
- Functions with high call frequency (AvgCountPerFrame)
- Functions with inconsistent performance (high MaxTimePerFrameMs vs AvgTimePerFrameMs)
- Framework: .NET 8.0
- Dependencies: FrameProCore.dll, SCLCoreCLR.dll
- Output Format: Structured JSON using System.Text.Json
- Performance: Handles large datasets efficiently (212 functions × 254 frames)
- Run the tool on your .framepro file
- Open
functions_analysis.jsonto identify top performance issues - Filter by
IsMainThread: trueto find UI-blocking functions - Sort by
TotalTimeMsto prioritize optimization efforts - Use
frame_analysis.jsonto analyze specific problematic frames - Cross-reference thread utilization to balance workload
{
"FunctionName": "Event Wait",
"ThreadId": 5032,
"ThreadName": "TaskGraph Render Thread 2",
"TotalTimeMs": 37150.96,
"TotalCount": 6426,
"MaxTimePerFrameMs": 519.17,
"MaxCountPerFrame": 38,
"AvgTimePerFrameMs": 146.84,
"AvgCountPerFrame": 25.40,
"ThreadUtilizationPercent": 100,
"IsMainThread": false,
"IsRenderThread": true,
"IsWorkerThread": true,
"ThreadPriority": 0
}