From 71bd34ac5bc1df8bae3974d53180d3918fa987d5 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Fri, 23 Oct 2015 21:56:47 -0400 Subject: [PATCH] Add interframe time delta to frame-events --- prospect-gl/2d.rkt | 20 ++++++++++++-------- prospect-gl/examples/basic.rkt | 22 +++++++++++----------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/prospect-gl/2d.rkt b/prospect-gl/2d.rkt index 8079e83..c7844f4 100644 --- a/prospect-gl/2d.rkt +++ b/prospect-gl/2d.rkt @@ -34,7 +34,7 @@ (struct window (width height) #:transparent) ;; Message sent by world. Describes frame about to be rendered. -(struct frame-event (counter timestamp target-frame-rate) #:transparent) +(struct frame-event (counter timestamp elapsed-ms target-frame-rate) #:transparent) ;; Message sent by world. Describes a key event. Key is a sealed ;; key-event%. `press?` is #t when the key is pressed (or @@ -223,6 +223,7 @@ (define counter 0) (define start-time (current-inexact-milliseconds)) + (define prev-frame-time start-time) (define/public (sim-time) (- (current-inexact-milliseconds) start-time)) @@ -239,18 +240,16 @@ (define world (make-world boot-actions)) (define event-queue (make-queue)) - (define target-frame-rate 30) - (define frame-count 0) + (define target-frame-rate 60) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (sleep-and-refresh) - (define target-sim-time (* frame-count (/ target-frame-rate))) + (define target-sim-time (* counter (/ 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))) + (refresh)) (define/public (set-target-frame-rate! r) (set! target-frame-rate r)) @@ -320,8 +319,13 @@ (define/override (on-paint) (with-gl-context (lambda () - (inject-event! (message (frame-event counter (sim-time) target-frame-rate))) - (set! counter (+ counter 1)) + (let ((this-frame-time (sim-time))) + (inject-event! (message (frame-event counter + this-frame-time + (- this-frame-time prev-frame-time) + target-frame-rate))) + (set! counter (+ counter 1)) + (set! prev-frame-time this-frame-time)) (quiesce!) (unless initialised? (glBlendFunc GL_ONE GL_ONE_MINUS_SRC_ALPHA) ;; premultiplied diff --git a/prospect-gl/examples/basic.rkt b/prospect-gl/examples/basic.rkt index 4cf126c..d7edf7d 100644 --- a/prospect-gl/examples/basic.rkt +++ b/prospect-gl/examples/basic.rkt @@ -45,35 +45,35 @@ (patch-project/set/single p key-pressed-projection)) (define new-keys-down (set-subtract (set-union keys-down added) removed)) (transition (list x y new-keys-down) '())] - [(message (at-meta (frame-event _ _ target-frame-rate))) + [(message (at-meta (frame-event _ _ elapsed-ms _))) (define-values (old-x old-y) (values x y)) - (define speed (/ 360.0 target-frame-rate)) - (let* ((x (if (set-member? keys-down 'left) (- x speed) x)) - (x (if (set-member? keys-down 'right) (+ x speed) x)) - (y (if (set-member? keys-down 'up) (- y speed) y)) - (y (if (set-member? keys-down 'down) (+ y speed) y))) + (define distance (* 0.360 elapsed-ms)) + (let* ((x (if (set-member? keys-down 'left) (- x distance) x)) + (x (if (set-member? keys-down 'right) (+ x distance) x)) + (y (if (set-member? keys-down 'up) (- y distance) y)) + (y (if (set-member? keys-down 'down) (+ y distance) y))) (and (not (and (= x old-x) (= y old-y))) (move-to x y keys-down)))] [_ #f])) (list 100 100 (set)) (update-sprites (simple-sprite -0.5 100 100 (image-width CC) (image-height CC) CC)) - (sub (frame-event ? ? ?) #:meta-level 1) + (sub (frame-event ? ? ? ?) #:meta-level 1) (sub (key-pressed ?)))) (define (spawn-frame-counter) (spawn (lambda (e s) (match e - [(message (at-meta (frame-event counter elapsed-ms _))) - (and (> elapsed-ms 0) - (let ((i (text (format "~a fps" (/ counter (/ elapsed-ms 1000.0))) 22 "black"))) + [(message (at-meta (frame-event counter sim-time-ms _ _))) + (and (> sim-time-ms 0) + (let ((i (text (format "~a fps" (/ counter (/ sim-time-ms 1000.0))) 22 "black"))) (transition s (update-sprites (simple-sprite -10 300 10 (image-width i) (image-height i) i)))))] [_ #f])) (void) - (sub (frame-event ? ? ?) #:meta-level 1))) + (sub (frame-event ? ? ? ?) #:meta-level 1))) (2d-world (spawn-keyboard-integrator) (spawn-background)