You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openmw/scripts/HOWTO-benchmark.md

4.7 KiB

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