From 50e4b860293cb9f6106ae502e921e95d5b84a27b Mon Sep 17 00:00:00 2001 From: Evan Hemsley <2342303+ehemsley@users.noreply.github.com> Date: Tue, 31 Dec 2019 16:13:11 -0800 Subject: [PATCH] optimize away a dictionary lookup in SpatialHash --- Bonk/BroadPhase/SpatialHash.cs | 26 ++++++++++---------------- Bonk/LongHelper.cs | 10 ++++++++++ Test/SpatialHashTest.cs | 26 +++++++++++++------------- 3 files changed, 33 insertions(+), 29 deletions(-) create mode 100644 Bonk/LongHelper.cs diff --git a/Bonk/BroadPhase/SpatialHash.cs b/Bonk/BroadPhase/SpatialHash.cs index 05f0099..f45a5db 100644 --- a/Bonk/BroadPhase/SpatialHash.cs +++ b/Bonk/BroadPhase/SpatialHash.cs @@ -12,7 +12,7 @@ namespace MoonTools.Core.Bonk { private readonly int cellSize; - private readonly Dictionary>> hashDictionary = new Dictionary>>(); + private readonly Dictionary> hashDictionary = new Dictionary>(); private readonly Dictionary IDLookup = new Dictionary(); public SpatialHash(int cellSize) @@ -41,17 +41,13 @@ namespace MoonTools.Core.Bonk { for (int j = minHash.Item2; j <= maxHash.Item2; j++) { - if (!hashDictionary.ContainsKey(i)) + var key = LongHelper.MakeLong(i, j); + if (!hashDictionary.ContainsKey(key)) { - hashDictionary.Add(i, new Dictionary>()); + hashDictionary.Add(key, new HashSet()); } - if (!hashDictionary[i].ContainsKey(j)) - { - hashDictionary[i].Add(j, new HashSet()); - } - - hashDictionary[i][j].Add(id); + hashDictionary[key].Add(id); IDLookup[id] = (shape, transform2D); } } @@ -70,9 +66,10 @@ namespace MoonTools.Core.Bonk { for (int j = minHash.Item2; j <= maxHash.Item2; j++) { - if (hashDictionary.ContainsKey(i) && hashDictionary[i].ContainsKey(j)) + var key = LongHelper.MakeLong(i, j); + if (hashDictionary.ContainsKey(key)) { - foreach (var t in hashDictionary[i][j]) + foreach (var t in hashDictionary[key]) { var (otherShape, otherTransform) = IDLookup[t]; if (!id.Equals(t)) { yield return (t, otherShape, otherTransform); } @@ -87,12 +84,9 @@ namespace MoonTools.Core.Bonk /// public void Clear() { - foreach (var innerDict in hashDictionary.Values) + foreach (var hash in hashDictionary.Values) { - foreach (var set in innerDict.Values) - { - set.Clear(); - } + hash.Clear(); } IDLookup.Clear(); diff --git a/Bonk/LongHelper.cs b/Bonk/LongHelper.cs new file mode 100644 index 0000000..f3277a3 --- /dev/null +++ b/Bonk/LongHelper.cs @@ -0,0 +1,10 @@ +namespace MoonTools.Core.Bonk +{ + public static class LongHelper + { + public static long MakeLong(int left, int right) + { + return ((long)left << 32) | ((uint)right); + } + } +} diff --git a/Test/SpatialHashTest.cs b/Test/SpatialHashTest.cs index 85bb512..6e9661c 100644 --- a/Test/SpatialHashTest.cs +++ b/Test/SpatialHashTest.cs @@ -13,28 +13,28 @@ namespace Tests { var spatialHash = new SpatialHash(16); - var rectA = new MoonTools.Core.Bonk.Rectangle(-2, -2, 2, 2); + var rectA = new Rectangle(-2, -2, 2, 2); var rectATransform = new Transform2D(new Vector2(-8, -8)); - var rectB = new MoonTools.Core.Bonk.Rectangle(-2, -2, 2, 2); + var rectB = new Rectangle(-2, -2, 2, 2); var rectBTransform = new Transform2D(new Vector2(8, 8)); - var rectC = new MoonTools.Core.Bonk.Rectangle(-2, -2, 2, 2); + var rectC = new Rectangle(-2, -2, 2, 2); var rectCTransform = new Transform2D(new Vector2(24, -4)); - var rectD = new MoonTools.Core.Bonk.Rectangle(-2, -2, 2, 2); + var rectD = new Rectangle(-2, -2, 2, 2); var rectDTransform = new Transform2D(new Vector2(24, 24)); - var circleA = new MoonTools.Core.Bonk.Circle(2); + var circleA = new Circle(2); var circleATransform = new Transform2D(new Vector2(24, -8)); - var circleB = new MoonTools.Core.Bonk.Circle(8); + var circleB = new Circle(8); var circleBTransform = new Transform2D(new Vector2(16, 16)); - var line = new MoonTools.Core.Bonk.Line(new Position2D(20, -4), new Position2D(22, -12)); + var line = new Line(new Position2D(20, -4), new Position2D(22, -12)); var lineTransform = new Transform2D(new Vector2(0, 0)); - var point = new MoonTools.Core.Bonk.Point(8, 8); + var point = new Point(8, 8); var pointTransform = Transform2D.DefaultTransform; spatialHash.Insert(0, rectA, rectATransform); @@ -63,13 +63,13 @@ namespace Tests { var spatialHash = new SpatialHash(16); - var rectA = new MoonTools.Core.Bonk.Rectangle(-2, -2, 2, 2); + var rectA = new Rectangle(-2, -2, 2, 2); var rectATransform = new Transform2D(new Vector2(-8, -8)); - var rectB = new MoonTools.Core.Bonk.Rectangle(-2, -2, 2, 2); + var rectB = new Rectangle(-2, -2, 2, 2); var rectBTransform = new Transform2D(new Vector2(-8, -8)); - var rectC = new MoonTools.Core.Bonk.Rectangle(-1, -1, 1, 1); + var rectC = new Rectangle(-1, -1, 1, 1); var rectCTransform = new Transform2D(new Vector2(-8, -8)); spatialHash.Insert(0, rectA, rectATransform); @@ -84,10 +84,10 @@ namespace Tests { var spatialHash = new SpatialHash(16); - var rectA = new MoonTools.Core.Bonk.Rectangle(-2, -2, 2, 2); + var rectA = new Rectangle(-2, -2, 2, 2); var rectATransform = new Transform2D(new Vector2(-8, -8)); - var rectB = new MoonTools.Core.Bonk.Rectangle(-2, -2, 2, 2); + var rectB = new Rectangle(-2, -2, 2, 2); var rectBTransform = new Transform2D(new Vector2(8, 8)); spatialHash.Insert(0, rectA, rectATransform);