From 4af0b4f579b03bdb9475c3d0e4c9ac7df29555d9 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Sat, 29 Apr 2023 12:21:49 -0400 Subject: Further reduce garbage generated by graphics state management. I'm not totally sure if this does much good, but it seems there's at least some savings by not using hash tables here. --- chickadee/graphics/engine.scm | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/chickadee/graphics/engine.scm b/chickadee/graphics/engine.scm index ed0650e..804e705 100644 --- a/chickadee/graphics/engine.scm +++ b/chickadee/graphics/engine.scm @@ -186,10 +186,15 @@ (define (install-graphics-state engine spec) (let ((binder (graphics-state-spec-binder spec)) - (default (graphics-state-spec-default spec))) - (hashv-set! (graphics-engine-states engine) - (graphics-state-spec-id spec) - (make-graphics-state binder default)))) + (default (graphics-state-spec-default spec)) + (states (graphics-engine-states engine)) + (id (graphics-state-spec-id spec))) + (unless (> (array-list-size states) id) + (let loop ((i (array-list-size states))) + (unless (> i id) + (array-list-push! states #f) + (loop (+ i 1))))) + (array-list-set! states id (make-graphics-state binder default)))) (define (install-graphics-variable engine var) (hashq-set! (graphics-engine-variables engine) @@ -212,7 +217,7 @@ (max-texture-size) (make-identity-matrix4) (make-guardian) - (make-hash-table) + (make-array-list) (make-hash-table)))) ;; Variable initialization must be delayed until after engine ;; creation because variable initializers may modify graphics @@ -257,26 +262,22 @@ (define* (set-graphics-engine-projection-matrix! matrix #:optional (engine (current-graphics-engine))) (%set-graphics-engine-projection-matrix! engine matrix)) +(define (graphics-engine-lookup-state engine spec) + (array-list-ref (graphics-engine-states engine) + (graphics-state-spec-id spec))) + (define* (graphics-engine-state-ref spec #:optional (engine (current-graphics-engine))) - (let ((state (hashv-ref (graphics-engine-states engine) - (graphics-state-spec-id spec)))) + (let ((state (graphics-engine-lookup-state engine spec))) (and state (graphics-state-ref state)))) (define* (graphics-engine-state-push! spec value #:optional (engine (current-graphics-engine))) - (if (graphics-state-spec? spec) - (let ((id (graphics-state-spec-id spec))) - (graphics-state-push! (hashv-ref (graphics-engine-states engine) id) - value)) - (error "not a graphics state specification" spec))) + (graphics-state-push! (graphics-engine-lookup-state engine spec) value)) (define* (graphics-engine-state-pop! spec #:optional (engine (current-graphics-engine))) - (if (graphics-state-spec? spec) - (let ((id (graphics-state-spec-id spec))) - (graphics-state-pop! (hashv-ref (graphics-engine-states engine) id))) - (error "not a graphics state specification" spec))) + (graphics-state-pop! (graphics-engine-lookup-state engine spec))) (define* (graphics-variable-ref var #:optional (engine (current-graphics-engine))) @@ -287,9 +288,9 @@ (hashq-set! (graphics-engine-variables engine) var value)) (define* (graphics-engine-commit! #:optional (engine (current-graphics-engine))) - (hash-for-each (lambda (id state) - (graphics-state-bind-maybe state)) - (graphics-engine-states engine))) + (array-list-for-each (lambda (id state) + (graphics-state-bind-maybe state)) + (graphics-engine-states engine))) (define* (graphics-engine-guard! obj #:optional (engine (current-graphics-engine))) -- cgit v1.2.3