OpenMW ships with its own benchmarking tool. This document describes how to collect performance data and vizualise it.
Collecting data #
The data collected is the same as displayed by repeatedly pressing F3 and/or F4 while in the game (correspondance is shown below).
We can select what should be collected by setting the OPENMW_OSG_STATS_LIST environment variables to a semi-colon separated list of metrics to collect. There can be any combination and order doesn't matter. Note that data collection can significantly reduce performance
| Metric to collect | Equivalent in-game profiler |
|---|---|
frame_rate |
Frame rate |
engine |
OpenMW specifics metric (white bars) |
event |
Event traversal bar |
update |
Update traversal bar |
rendering |
Draw bar |
gpu |
GPU bar |
times |
Alias for event;update;rendering;engine;gpu, that is all graphs |
cameraobjects |
Table shown when pressing F3 3 times |
viewerobjects |
Table shown when pressing F3 4 times |
resource |
Table shown when pressing F4 |
It is necessary to write the collected metrics to a file which needs to be defined by the OPENMW_OSG_STATS_FILE environment variable.
Example #
Posix shell
OPENMW_OSG_STATS_FILE=/tmp/stats OPENMW_OSG_STATS_LIST="resource;engine" /usr/local/bin/openmw
Windows PowerShell
$env:OPENMW_OSG_STATS_FILE="c:\stats"
$env:OPENMW_OSG_STATS_LIST="resource;engine"
openmw
Analyzing results #
scripts/osg_stats.py is a python script that can perform statistical analysis and generate graphs from a trace. It doesn't need to be run on the same machine as the trace was taken.
osg_stats.py --help list the available options.
Examples #
Print the available metrics in a given trace file #
osg_stats.py --print_keys /tmp/stats
Sample output
gui_time_begin gui_time_end gui_time_taken input_time_begin input_time_end input_time_taken lua_time_begin lua_time_end lua_time_taken mechanics_time_begin mechanics_time_end mechanics_time_taken physics_time_begin physics_time_end physics_time_taken physicsworker_time_begin physicsworker_time_end physicsworker_time_taken script_time_begin script_time_end script_time_taken sound_time_begin sound_time_end sound_time_taken state_time_begin state_time_end state_time_taken world_time_begin world_time_end world_time_taken
Print a table with statistics data for some metrics #
osg_stats.py --stats physicsworker_time_taken --stats mechanics_time_taken --stats world_time_taken --stats physics_time_taken /tmp/stats
Sample output
source key number min max mean median stdev q95 /tmp/stats physicsworker_time_taken 56245 0.0 0.01526 0.0018826463330073784 7.7e-05 0.003210274653689913 0.009509799999999995 /tmp/stats mechanics_time_taken 56245 0.0 0.015808 0.0030202102942483776 0.002177 0.002565895193458489 0.008489799999999995 /tmp/stats world_time_taken 56245 0.0 0.003643 5.230777846919726e-05 5.1e-05 1.7322475294417906e-05 6.6e-05 /tmp/stats physics_time_taken 56245 0.0 0.004407 0.00019985403146946396 0.000129 0.0002106166003676915 0.000697
Plot a timeserie of aforementioned metrics, ignoring first 1000 frames #
osg_stats.py --begin_frame 1000 --end_frame 1200 --timeseries physicsworker_time_taken --timeseries mechanics_time_taken --timeseries world_time_taken --timeseries physics_time_taken /tmp/stats
Plot time spent in physics and mechanics depending on number of actors in the scene #
osg_stats.py --plot 'Physics Actors' physicsworker_time_taken mean --plot 'Physics Actors' mechanics_time_taken mean --plot 'Physics Actors' physics_time_taken mean /tmp/stats
Plot timeserie from 2 traces #
osg_stats.py --timeseries 'Frame Duration' /tmp/shadowson /tmp/shadowsoff