From 6af6195bd03136fa57d55455aebab7b936f9a9d9 Mon Sep 17 00:00:00 2001
From: faiface <faiface@ksp.sk>
Date: Sun, 2 Jul 2017 23:23:27 +0200
Subject: [PATCH] optimize Drawer (reduce map access)

---
 drawer.go | 61 ++++++++++++++++++++++++++-----------------------------
 1 file changed, 29 insertions(+), 32 deletions(-)

diff --git a/drawer.go b/drawer.go
index e4ccd45..1836266 100644
--- a/drawer.go
+++ b/drawer.go
@@ -24,23 +24,19 @@ type Drawer struct {
 	Triangles Triangles
 	Picture   Picture
 
-	tris   map[Target]TargetTriangles
-	clean  map[Target]bool
-	pics   map[targetPicturePair]TargetPicture
-	dirty  bool
-	inited bool
+	targets map[Target]*drawerTarget
+	inited  bool
 }
 
-type targetPicturePair struct {
-	Target  Target
-	Picture Picture
+type drawerTarget struct {
+	tris  TargetTriangles
+	pics  map[Picture]TargetPicture
+	clean bool
 }
 
 func (d *Drawer) lazyInit() {
 	if !d.inited {
-		d.tris = make(map[Target]TargetTriangles)
-		d.clean = make(map[Target]bool)
-		d.pics = make(map[targetPicturePair]TargetPicture)
+		d.targets = make(map[Target]*drawerTarget)
 		d.inited = true
 	}
 }
@@ -50,7 +46,9 @@ func (d *Drawer) lazyInit() {
 func (d *Drawer) Dirty() {
 	d.lazyInit()
 
-	d.dirty = true
+	for _, t := range d.targets {
+		t.clean = false
+	}
 }
 
 // Draw efficiently draws Triangles with Picture onto the provided Target.
@@ -60,40 +58,39 @@ func (d *Drawer) Dirty() {
 func (d *Drawer) Draw(t Target) {
 	d.lazyInit()
 
-	if d.dirty {
-		for t := range d.clean {
-			d.clean[t] = false
-		}
-		d.dirty = false
-	}
-
 	if d.Triangles == nil {
 		return
 	}
 
-	tri := d.tris[t]
-	if tri == nil {
-		tri = t.MakeTriangles(d.Triangles)
-		d.tris[t] = tri
-		d.clean[t] = true
+	dt := d.targets[t]
+	if dt == nil {
+		dt = &drawerTarget{
+			pics: make(map[Picture]TargetPicture),
+		}
+		d.targets[t] = dt
+	}
+
+	if dt.tris == nil {
+		dt.tris = t.MakeTriangles(d.Triangles)
+		dt.clean = true
 	}
 
-	if !d.clean[t] {
-		tri.SetLen(d.Triangles.Len())
-		tri.Update(d.Triangles)
-		d.clean[t] = true
+	if !dt.clean {
+		dt.tris.SetLen(d.Triangles.Len())
+		dt.tris.Update(d.Triangles)
+		dt.clean = true
 	}
 
 	if d.Picture == nil {
-		tri.Draw()
+		dt.tris.Draw()
 		return
 	}
 
-	pic := d.pics[targetPicturePair{t, d.Picture}]
+	pic := dt.pics[d.Picture]
 	if pic == nil {
 		pic = t.MakePicture(d.Picture)
-		d.pics[targetPicturePair{t, d.Picture}] = pic
+		dt.pics[d.Picture] = pic
 	}
 
-	pic.Draw(tri)
+	pic.Draw(dt.tris)
 }
-- 
GitLab