OpenMW is an open implementation of the Morrowind engine
openmw scripts HOWTO-benchmark.md
4.8 kB
Markdown

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 #

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

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