bd237d342ac4

Clean up the FPS measuring stuff
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Thu, 28 Apr 2016 22:29:47 +0000
parents b4b4043dd88a
children 82d6ce93e3e7
branches/tags (none)
files package.lisp src/fps.lisp src/main.lisp

Changes

--- a/package.lisp	Sun Apr 24 21:46:22 2016 +0000
+++ b/package.lisp	Thu Apr 28 22:29:47 2016 +0000
@@ -103,7 +103,7 @@
     #:coding-math.quickutils
     #:coding-math.utils)
   (:export
-    #:calc-fps
+    #:with-fps
     #:draw-fps))
 
 (defpackage #:coding-math
--- a/src/fps.lisp	Sun Apr 24 21:46:22 2016 +0000
+++ b/src/fps.lisp	Thu Apr 28 22:29:47 2016 +0000
@@ -4,18 +4,36 @@
 (defvar *last-draw* 0)
 (defvar *fps* 0.0)
 (defvar *mspf* 0.0)
+(defvar *frame* 0)
+
+
+(defparameter *rolling-average* 0.0)
+(defparameter *rolling-average-count* 10)
 
 
-(defun calc-fps (frames)
-  (let* ((current-draw (get-internal-real-time))
-         (elapsed (float (/ (- current-draw *last-draw*)
-                            internal-time-units-per-second))))
-    (setf *last-draw* current-draw)
-    (setf *mspf* (* 1000 (/ elapsed frames)))
-    (setf *fps* (* frames (/ 1 elapsed)))))
+(defun update-average (frame-time)
+  (setf *rolling-average*
+        (/ (+ frame-time
+              (* *rolling-average* *rolling-average-count*))
+           (1+ *rolling-average-count*))))
+
+(defun update-fps ()
+  (setf *mspf* (* 1000.0
+                  (/ *rolling-average*
+                     internal-time-units-per-second))
+        *fps* (/ 1000.0 *mspf*)))
 
 (defun draw-fps ()
-  (text (format nil "MSPF: ~,1F" *mspf*) 0 0)
-  (text (format nil "FPS: ~,1F" *fps*) 0 20))
+  (text (format nil "MSPF: ~,2F" *mspf*) 0 0)
+  (text (format nil "PFPS: ~,2F" *fps*) 0 20))
 
 
+(defmacro with-fps (&body body)
+  (let ((start (gensym "start")))
+    `(let ((,start (get-internal-real-time)))
+      ,@body
+      (update-average (- (get-internal-real-time) ,start))
+      (draw-fps)
+      (incf *frame*)
+      (when (dividesp *frame* 15)
+        (update-fps)))))
--- a/src/main.lisp	Sun Apr 24 21:46:22 2016 +0000
+++ b/src/main.lisp	Thu Apr 28 22:29:47 2016 +0000
@@ -44,37 +44,32 @@
                :height *height*
                :debug :scancode-d)
     ((mouse)
-     (frame)
      (r)
      (mr)
      )
-  (background (gray 1))
-  (incf frame)
-  ;;
+  (with-fps
+    (background (gray 1))
+    ;;
 
-  (setf (getf mr :x) (getf mouse :x))
-  (setf (getf mr :y) (getf mouse :y))
+    (setf (getf mr :x) (getf mouse :x))
+    (setf (getf mr :y) (getf mouse :y))
 
-  (with-pen (make-pen :stroke (gray 0.5)
-                      :fill (cond
-                              ((rects-collide-p r mr)
-                               (rgb 0 0 0.7 0.5))
-                              (t (gray 0.9))))
-    (draw-rect r)
-    (draw-rect mr))
-
-  ;;
-  (when (zerop (mod frame 20))
-    (calc-fps 20))
-  (draw-fps))
+    (with-pen (make-pen :stroke (gray 0.5)
+                        :fill (cond
+                                ((rects-collide-p r mr)
+                                 (rgb 0 0 0.7 0.5))
+                                (t (gray 0.9))))
+      (draw-rect r)
+      (draw-rect mr))
+    ;;
+    ))
 
 (defun make-cm ()
   (make-sketch 'cm
     (mouse (list :x 0 :y 0))
-    (frame 1)
     (r (list :x 20 :y 50 :width (- *width* 40) :height 30))
-    (mr (list :x 300 :y 300 :width 90 :height 90))
-    ))
+    (mr (list :x 300 :y 300 :width 90 :height 90))))
+
 
 
 ;;;; Mouse