1 USING: accessors destructors kernel math math.order namespaces
6 { tick-length integer read-only }
11 { tick-number integer }
12 { frame-number integer }
13 { benchmark-time integer }
14 { benchmark-tick-number integer }
15 { benchmark-frame-number integer } ;
17 GENERIC: tick* ( delegate -- )
18 GENERIC: draw* ( tick-slice delegate -- )
22 : since-last-tick ( loop -- milliseconds )
23 last-tick>> millis swap - ;
25 : tick-slice ( loop -- slice )
26 [ since-last-tick ] [ tick-length>> ] bi /f 1.0 min ;
28 CONSTANT: MAX-FRAMES-TO-SKIP 5
33 [ 1+ ] change-frame-number
34 [ tick-slice ] [ delegate>> ] bi draw* ;
39 : increment-tick ( loop -- )
40 [ 1+ ] change-tick-number
41 dup tick-length>> [ + ] curry change-last-tick
44 : ?tick ( loop count -- )
45 dup zero? [ drop millis >>last-tick drop ] [
46 over [ since-last-tick ] [ tick-length>> ] bi >=
47 [ [ drop increment-tick ] [ drop tick ] [ 1- ?tick ] 2tri ]
51 : (run-loop) ( loop -- )
53 [ [ MAX-FRAMES-TO-SKIP ?tick ] [ redraw ] [ yield (run-loop) ] tri ]
56 : run-loop ( loop -- )
57 dup game-loop [ (run-loop) ] with-variable ;
59 : benchmark-millis ( loop -- millis )
60 millis swap benchmark-time>> - ;
64 : reset-loop-benchmark ( loop -- )
65 millis >>benchmark-time
66 dup tick-number>> >>benchmark-tick-number
67 dup frame-number>> >>benchmark-frame-number
70 : benchmark-ticks-per-second ( loop -- n )
71 [ tick-number>> ] [ benchmark-tick-number>> - ] [ benchmark-millis ] tri /f ;
72 : benchmark-frames-per-second ( loop -- n )
73 [ frame-number>> ] [ benchmark-frame-number>> - ] [ benchmark-millis ] tri /f ;
75 : start-loop ( loop -- )
78 [ reset-loop-benchmark ]
79 [ [ run-loop ] curry "game loop" spawn ]
82 : stop-loop ( loop -- )
87 : <game-loop> ( tick-length delegate -- loop )
88 millis f f 0 0 millis 0 0