diff --git a/Quadtree.cs b/Quadtree.cs index 99a7869..db1036a 100644 --- a/Quadtree.cs +++ b/Quadtree.cs @@ -47,8 +47,16 @@ namespace Quadtree /// private float m_maxObjectRadius; + /// + /// Stack of vertex indices with their bounding boxes. It is reused for each query. + /// private Stack _queryStack; + /// + /// Stack of vertex indices. It is reused for each query. + /// + private Stack _vertexStack; + public Quadtree(int maxLeafSize, int maxTreeDepth) { m_maxLeafSize = maxLeafSize; @@ -58,6 +66,7 @@ namespace Quadtree m_rootBoundingBox = new BoundingBox2(Vector2.Zero, Vector2.Zero); m_maxObjectRadius = 0f; _queryStack = new Stack(); + _vertexStack = new Stack(); } public void Add(IWorldObject obj) @@ -347,21 +356,19 @@ namespace Quadtree private void QueryAppendContainedItems(int vertexIndex, BoundingBox2 box, List resultList) { - // TODO: Stack as reused member variable? - Stack stack = new Stack(); - stack.Push(vertexIndex); + _vertexStack.Push(vertexIndex); - while (stack.Count > 0) + while (_vertexStack.Count > 0) { - int current = stack.Pop(); + int current = _vertexStack.Pop(); if (m_vertices[current].ChildCount == -1) { // Branches into all vertices until leaves are found. int childIndex = m_vertices[current].FirstChildIndex; - stack.Push(childIndex++); - stack.Push(childIndex++); - stack.Push(childIndex++); - stack.Push(childIndex); + _vertexStack.Push(childIndex++); + _vertexStack.Push(childIndex++); + _vertexStack.Push(childIndex++); + _vertexStack.Push(childIndex); } else {