0851dc71ee9e

Add timing, improve coordinate store
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Sun, 07 Aug 2016 15:35:50 +0000
parents 94af6897af93
children 3412bc68ba84
branches/tags (none)
files silt.lisp

Changes

--- a/silt.lisp	Sun Aug 07 03:52:51 2016 +0000
+++ b/silt.lisp	Sun Aug 07 15:35:50 2016 +0000
@@ -16,6 +16,7 @@
 (defparameter *game-log* nil)
 (defparameter *population* 0)
 (defparameter *tick* 0)
+(defparameter *timing* (cons 0 0))
 
 
 (deftype world-coordinate ()
@@ -196,6 +197,20 @@
        (< -1 sy *screen-height*)))
 
 
+(defmacro timing (&body body)
+  `(let ((start (get-internal-run-time)))
+     (prog1
+       (progn ,@body)
+       (setf (cdr *timing*)
+             (/ (+ (* (car *timing*) (cdr *timing*))
+                   (- (get-internal-run-time) start))
+               (incf (car *timing*)))))))
+
+(defun reset-timing ()
+  (setf *timing* (cons 0 0)))
+
+
+
 ;;;; Terrain Generation ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (defun average4 (a b c d)
   (/ (+ a b c d) 4))
@@ -454,27 +469,32 @@
 
 ;;;; Components ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Coordinates
-(define-component coords x y)
+(define-component coords
+  (x :type world-coordinate)
+  (y :type world-coordinate))
 
 
-(defparameter *coords-contents* (make-hash-table))
+(deftype coordinate-array ()
+  `(simple-array list (,+world-size+ ,+world-size+)))
+
+(declaim (type coordinate-array *coords-contents*))
+(defparameter *coords-contents*
+  (make-array (list +world-size+ +world-size+) :initial-element nil))
 
 
-(defun coordinate-key (x y)
-  (array-row-major-index *heightmap* (wrap x) (wrap y)))
-
-(defun coordinate-key-for-entity (e)
-  (coordinate-key (coords/x e) (coords/y e)))
-
+(declaim (ftype (function (fixnum fixnum) list)
+                coords-lookup)
+         (ftype (function (coords) list)
+                coords-insert-entity coords-remove-entity)
+         (ftype (function (coords fixnum fixnum) list)
+                coords-move-entity))
 
 (defun coords-insert-entity (e)
-  (push e (gethash (coordinate-key-for-entity e) *coords-contents*)))
+  (push e (aref *coords-contents* (coords/x e) (coords/y e))))
 
 (defun coords-remove-entity (e)
-  (let ((k (coordinate-key-for-entity e)))
-    (when (null (zap% (gethash k *coords-contents*)
-                      #'delete e %))
-      (remhash k *coords-contents*))))
+  (zap% (aref *coords-contents* (coords/x e) (coords/y e))
+        #'delete e %))
 
 (defun coords-move-entity (e new-x new-y)
   (coords-remove-entity e)
@@ -483,8 +503,12 @@
   (coords-insert-entity e))
 
 (defun coords-lookup (x y)
-  (gethash (coordinate-key x y) *coords-contents*))
+  (aref *coords-contents* (wrap x) (wrap y)))
+
 
+(defmethod initialize-instance :after ((entity coords) &key)
+  (zapf (coords/x entity) #'wrap
+        (coords/y entity) #'wrap))
 
 (defmethod entity-created :after ((entity coords))
   (coords-insert-entity entity))
@@ -851,7 +875,12 @@
       (format nil "[~D, ~D]" *cursor-x* *cursor-y*)
       (format nil "~D creature~:P" *population*)
       (format nil "~D entit~:@P" (hash-table-count *entity-index*))
-      (format nil "tick ~D" *tick*))
+      (format nil "tick ~D" *tick*)
+      (if (equal *timing* (cons 0 0))
+        ""
+        (format nil "~,5Fms per run over ~D runs"
+                (/ (cdr *timing*) internal-time-units-per-second 1/1000)
+                (car *timing*))))
     (1- *screen-width*)
     1))
 
@@ -1028,7 +1057,6 @@
          (state-map-loop)))))
 
 
-
 (defun state-help ()
   (render-help)
   (press-any-key)
@@ -1062,3 +1090,4 @@
 ; (run)
 ; (start-profiling)
 ; (stop-profiling)
+