game-loop vocabulary
							parent
							
								
									a2c7074a6b
								
							
						
					
					
						commit
						fa0856b42e
					
				| 
						 | 
				
			
			@ -0,0 +1,93 @@
 | 
			
		|||
USING: accessors destructors kernel math math.order namespaces
 | 
			
		||||
system threads ;
 | 
			
		||||
IN: game-loop
 | 
			
		||||
 | 
			
		||||
TUPLE: game-loop
 | 
			
		||||
    { tick-length integer read-only }
 | 
			
		||||
    delegate
 | 
			
		||||
    { last-tick integer }
 | 
			
		||||
    thread 
 | 
			
		||||
    { running? boolean }
 | 
			
		||||
    { tick-number integer }
 | 
			
		||||
    { frame-number integer }
 | 
			
		||||
    { benchmark-time integer }
 | 
			
		||||
    { benchmark-tick-number integer }
 | 
			
		||||
    { benchmark-frame-number integer } ;
 | 
			
		||||
 | 
			
		||||
GENERIC: tick* ( delegate -- )
 | 
			
		||||
GENERIC: draw* ( tick-slice delegate -- )
 | 
			
		||||
 | 
			
		||||
SYMBOL: game-loop
 | 
			
		||||
 | 
			
		||||
: since-last-tick ( loop -- milliseconds )
 | 
			
		||||
    last-tick>> millis swap - ;
 | 
			
		||||
 | 
			
		||||
: tick-slice ( loop -- slice )
 | 
			
		||||
    [ since-last-tick ] [ tick-length>> ] bi /f 1.0 min ;
 | 
			
		||||
 | 
			
		||||
CONSTANT: MAX-FRAMES-TO-SKIP 5
 | 
			
		||||
 | 
			
		||||
<PRIVATE
 | 
			
		||||
 | 
			
		||||
: redraw ( loop -- )
 | 
			
		||||
    [ 1+ ] change-frame-number
 | 
			
		||||
    [ tick-slice ] [ delegate>> ] bi draw* ;
 | 
			
		||||
 | 
			
		||||
: tick ( loop -- )
 | 
			
		||||
    delegate>> tick* ;
 | 
			
		||||
 | 
			
		||||
: increment-tick ( loop -- )
 | 
			
		||||
    [ 1+ ] change-tick-number
 | 
			
		||||
    dup tick-length>> [ + ] curry change-last-tick
 | 
			
		||||
    drop ;
 | 
			
		||||
 | 
			
		||||
: ?tick ( loop count -- )
 | 
			
		||||
    dup zero? [ drop millis >>last-tick drop ] [
 | 
			
		||||
        over [ since-last-tick ] [ tick-length>> ] bi >=
 | 
			
		||||
        [ [ drop increment-tick ] [ drop tick ] [ 1- ?tick ] 2tri ]
 | 
			
		||||
        [ 2drop ] if
 | 
			
		||||
    ] if ;
 | 
			
		||||
 | 
			
		||||
: (run-loop) ( loop -- )
 | 
			
		||||
    dup running?>>
 | 
			
		||||
    [ [ MAX-FRAMES-TO-SKIP ?tick ] [ redraw ] [ yield (run-loop) ] tri ]
 | 
			
		||||
    [ drop ] if ;
 | 
			
		||||
 | 
			
		||||
: run-loop ( loop -- )
 | 
			
		||||
    dup game-loop [ (run-loop) ] with-variable ;
 | 
			
		||||
 | 
			
		||||
: benchmark-millis ( loop -- millis )
 | 
			
		||||
    millis swap benchmark-time>> - ;
 | 
			
		||||
 | 
			
		||||
PRIVATE>
 | 
			
		||||
 | 
			
		||||
: reset-loop-benchmark ( loop -- )
 | 
			
		||||
    millis >>benchmark-time
 | 
			
		||||
    dup tick-number>> >>benchmark-tick-number
 | 
			
		||||
    dup frame-number>> >>benchmark-frame-number
 | 
			
		||||
    drop ;
 | 
			
		||||
 | 
			
		||||
: benchmark-ticks-per-second ( loop -- n )
 | 
			
		||||
    [ tick-number>> ] [ benchmark-tick-number>> - ] [ benchmark-millis ] tri /f ;
 | 
			
		||||
: benchmark-frames-per-second ( loop -- n )
 | 
			
		||||
    [ frame-number>> ] [ benchmark-frame-number>> - ] [ benchmark-millis ] tri /f ;
 | 
			
		||||
 | 
			
		||||
: start-loop ( loop -- )
 | 
			
		||||
    millis >>last-tick
 | 
			
		||||
    t >>running?
 | 
			
		||||
    [ reset-loop-benchmark ]
 | 
			
		||||
    [ [ run-loop ] curry "game loop" spawn ]
 | 
			
		||||
    [ (>>thread) ] tri ;
 | 
			
		||||
 | 
			
		||||
: stop-loop ( loop -- )
 | 
			
		||||
    f >>running?
 | 
			
		||||
    f >>thread
 | 
			
		||||
    drop ;
 | 
			
		||||
 | 
			
		||||
: <game-loop> ( tick-length delegate -- loop )
 | 
			
		||||
    millis f f 0 0 millis 0 0
 | 
			
		||||
    game-loop boa ;
 | 
			
		||||
 | 
			
		||||
M: game-loop dispose
 | 
			
		||||
    stop-loop ;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue