Use benchmark.struct vocab to record tick/draw timings in game loop

db4
Doug Coleman 2010-06-08 18:08:43 -05:00
parent 46ad6b63e6
commit 445b43d924
3 changed files with 48 additions and 40 deletions

View File

@ -31,16 +31,16 @@ HELP: benchmark-frames-per-second
{ "loop" game-loop }
{ "n" float }
}
{ $description "Returns the average number of times per second the game loop has called " { $link draw* } " on its delegate since the game loop was started with " { $link start-loop } " or since the benchmark counters have been reset with " { $link reset-loop-benchmark } "." } ;
{ $description "Returns the average number of times per second the game loop has called " { $link draw* } " on its delegate since the game loop was started with " { $link start-loop } "." } ;
HELP: benchmark-ticks-per-second
{ $values
{ "loop" game-loop }
{ "n" float }
}
{ $description "Returns the average number of times per second the game loop has called " { $link tick* } " on its tick delegate since the game loop was started with " { $link start-loop } " or since the benchmark counters have been reset with " { $link reset-loop-benchmark } "." } ;
{ $description "Returns the average number of times per second the game loop has called " { $link tick* } " on its tick delegate since the game loop was started." } ;
{ reset-loop-benchmark benchmark-frames-per-second benchmark-ticks-per-second } related-words
{ benchmark-frames-per-second benchmark-ticks-per-second } related-words
HELP: draw*
{ $values
@ -59,12 +59,6 @@ HELP: game-loop-error
}
{ $description "If an uncaught error is thrown from inside a game loop delegate's " { $link tick* } " or " { $link draw* } ", the game loop will catch the error, stop the game loop, and rethrow an error of this class." } ;
HELP: reset-loop-benchmark
{ $values
{ "loop" game-loop }
}
{ $description "Resets the benchmark counters on a " { $link game-loop } ". Subsequent calls to " { $link benchmark-frames-per-second } " and " { $link benchmark-ticks-per-second } " will measure their values from the point " { $snippet "reset-loop-benchmark" } " was called." } ;
HELP: start-loop
{ $values
{ "loop" game-loop }
@ -111,7 +105,6 @@ ARTICLE: "game.loop" "Game loops"
}
"The game loop maintains performance counters:"
{ $subsections
reset-loop-benchmark
benchmark-frames-per-second
benchmark-ticks-per-second
}

View File

@ -1,6 +1,9 @@
! (c)2009 Joe Groff bsd license
USING: accessors alarms calendar continuations destructors fry
kernel math math.order namespaces system ui ui.gadgets.worlds ;
USING: accessors alarms alien.c-types calendar classes.struct
continuations destructors fry kernel math math.order memory
namespaces sequences specialized-vectors system
tools.memory ui ui.gadgets.worlds vm vocabs.loader arrays
benchmark.struct ;
IN: game.loop
TUPLE: game-loop
@ -9,12 +12,23 @@ TUPLE: game-loop
draw-delegate
{ last-tick integer }
{ running? boolean }
{ tick-number integer }
{ frame-number integer }
{ benchmark-time integer }
{ benchmark-tick-number integer }
{ benchmark-frame-number integer }
alarm ;
{ tick# integer }
{ frame# integer }
alarm
benchmark-data ;
STRUCT: game-loop-benchmark
{ benchmark-data-pair benchmark-data-pair }
{ tick# ulonglong }
{ frame# ulonglong } ;
SPECIALIZED-VECTOR: game-loop-benchmark
: <game-loop-benchmark> ( benchmark-data-pair tick frame -- obj )
\ game-loop-benchmark <struct>
swap >>frame#
swap >>tick#
swap >>benchmark-data-pair ; inline
GENERIC: tick* ( delegate -- )
GENERIC: draw* ( tick-slice delegate -- )
@ -44,16 +58,25 @@ TUPLE: game-loop-error game-loop error ;
<PRIVATE
: record-benchmarking ( benchark-data-pair loop -- )
[ tick#>> ]
[ frame#>> <game-loop-benchmark> ]
[ benchmark-data>> ] tri push ;
: redraw ( loop -- )
[ 1 + ] change-frame-number
[ tick-slice ] [ draw-delegate>> ] bi draw* ;
[ 1 + ] change-frame#
[
[ tick-slice ] [ draw-delegate>> ] bi [ draw* ] with-benchmarking
] keep record-benchmarking ;
: tick ( loop -- )
tick-delegate>> tick* ;
[
[ tick-delegate>> tick* ] with-benchmarking
] keep record-benchmarking ;
: increment-tick ( loop -- )
[ 1 + ] change-tick-number
dup tick-interval-nanos>> [ + ] curry change-last-tick
[ 1 + ] change-tick#
dup tick-interval-nanos>> '[ _ + ] change-last-tick
drop ;
: ?tick ( loop count -- )
@ -63,20 +86,13 @@ TUPLE: game-loop-error game-loop error ;
[ 2drop ] if
] if-zero ;
: benchmark-nanos ( loop -- nanos )
nano-count swap benchmark-time>> - ;
PRIVATE>
: reset-loop-benchmark ( loop -- loop )
nano-count >>benchmark-time
dup tick-number>> >>benchmark-tick-number
dup frame-number>> >>benchmark-frame-number ;
! : benchmark-ticks-per-second ( loop -- n )
! [ tick#>> ] [ benchmark-tick#>> - ] [ benchmark-nanos ] tri /f ;
: benchmark-ticks-per-second ( loop -- n )
[ tick-number>> ] [ benchmark-tick-number>> - ] [ benchmark-nanos ] tri /f ;
: benchmark-frames-per-second ( loop -- n )
[ frame-number>> ] [ benchmark-frame-number>> - ] [ benchmark-nanos ] tri /f ;
! : benchmark-frames-per-second ( loop -- n )
! [ frame#>> ] [ benchmark-frame#>> - ] [ benchmark-nanos ] tri /f ;
: (game-tick) ( loop -- )
dup running?>>
@ -91,7 +107,6 @@ PRIVATE>
: start-loop ( loop -- )
nano-count >>last-tick
t >>running?
reset-loop-benchmark
[
[ '[ _ game-tick ] f ]
[ tick-interval-nanos>> nanoseconds ] bi
@ -103,7 +118,8 @@ PRIVATE>
alarm>> stop-alarm ;
: <game-loop*> ( tick-interval-nanos tick-delegate draw-delegate -- loop )
nano-count f 0 0 nano-count 0 0 f
nano-count f 0 0 f
game-loop-benchmark-vector{ } clone
game-loop boa ;
: <game-loop> ( tick-interval-nanos delegate -- loop )
@ -112,6 +128,5 @@ PRIVATE>
M: game-loop dispose
stop-loop ;
USE: vocabs.loader
{ "game.loop" "prettyprint" } "game.loop.prettyprint" require-when

View File

@ -229,9 +229,9 @@ M: terrain-world tick-game-world
GL_TEXTURE_2D GL_TEXTURE_WRAP_T GL_CLAMP_TO_EDGE glTexParameteri ;
: sky-gradient ( world -- t )
game-loop>> tick-number>> SKY-PERIOD mod SKY-PERIOD /f ;
game-loop>> tick#>> SKY-PERIOD mod SKY-PERIOD /f ;
: sky-theta ( world -- theta )
game-loop>> tick-number>> SKY-SPEED * ;
game-loop>> tick#>> SKY-SPEED * ;
M: terrain-world begin-game-world
"2.0" { "GL_ARB_vertex_buffer_object" "GL_ARB_shader_objects" }