diff --git a/TODO.md b/TODO.md index ce68e12..8663c61 100644 --- a/TODO.md +++ b/TODO.md @@ -1 +1,2 @@ - - Some way of clamping the frame rate to e.g. 60Hz and failing that 24Hz + - Some way of adjusting target frame rate based on whether we're + achieving the goal or not; e.g. fall back from 60Hz to 24Hz diff --git a/prospect-gl/2d.rkt b/prospect-gl/2d.rkt index 46dca0d..c9a0787 100644 --- a/prospect-gl/2d.rkt +++ b/prospect-gl/2d.rkt @@ -239,6 +239,22 @@ (define world (make-world boot-actions)) (define event-queue (make-queue)) + (define target-frame-rate 30) + (define frame-count 0) + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + (define (sleep-and-refresh) + (define target-sim-time (* frame-count (/ target-frame-rate))) + (define sleep-time (- target-sim-time (/ (sim-time) 1000.0))) + (when (positive? sleep-time) + (sleep/yield sleep-time)) + (refresh) + (set! frame-count (+ frame-count 1))) + + (define/public (set-target-frame-rate! r) + (set! target-frame-rate r)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (inject-event! e) @@ -319,7 +335,7 @@ (render-scene! prelude sprites postlude) (glFlush) (swap-gl-buffers))) - (queue-callback (lambda () (refresh)) #f)) + (queue-callback (lambda () (sleep-and-refresh)) #f)) (define/override (on-size width height) (with-gl-context