From d1cc3dcb80107495ae8fea763ddfdd99a6ff31c6 Mon Sep 17 00:00:00 2001 From: wraitii Date: Wed, 8 Jun 2016 17:06:58 +0000 Subject: [PATCH] Re-use the same vector for the range manager spatial subdivision queries to cut down on allocations and memory fragmentation. Refs #4045 This was SVN commit r18344. --- .../components/CCmpRangeManager.cpp | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/source/simulation2/components/CCmpRangeManager.cpp b/source/simulation2/components/CCmpRangeManager.cpp index f6d8106e66..69245d1dc2 100644 --- a/source/simulation2/components/CCmpRangeManager.cpp +++ b/source/simulation2/components/CCmpRangeManager.cpp @@ -320,6 +320,7 @@ public: EntityMap m_EntityData; FastSpatialSubdivision m_Subdivision; // spatial index of m_EntityData + std::vector m_SubdivisionResults; // LOS state: static const player_id_t MAX_LOS_PLAYER_ID = 16; @@ -379,6 +380,8 @@ public: // SetBounds is called) ResetSubdivisions(entity_pos_t::FromInt(1024), entity_pos_t::FromInt(1024)); + m_SubdivisionResults.reserve(4096); + // The whole map should be visible to Gaia by default, else e.g. animals // will get confused when trying to run from enemies m_LosRevealAll.resize(MAX_LOS_PLAYER_ID+2,false); @@ -1064,18 +1067,18 @@ public: CFixedVector3D pos3d = cmpSourcePosition->GetPosition()+ CFixedVector3D(entity_pos_t::Zero(), q.elevationBonus, entity_pos_t::Zero()) ; // Get a quick list of entities that are potentially in range, with a cutoff of 2*maxRange - std::vector ents; - m_Subdivision.GetNear(ents, pos, q.maxRange*2); + m_SubdivisionResults.clear(); + m_Subdivision.GetNear(m_SubdivisionResults, pos, q.maxRange * 2); - for (size_t i = 0; i < ents.size(); ++i) + for (size_t i = 0; i < m_SubdivisionResults.size(); ++i) { - EntityMap::const_iterator it = m_EntityData.find(ents[i]); + EntityMap::const_iterator it = m_EntityData.find(m_SubdivisionResults[i]); ENSURE(it != m_EntityData.end()); if (!TestEntityQuery(q, it->first, it->second)) continue; - CmpPtr cmpSecondPosition(GetSimContext(), ents[i]); + CmpPtr cmpSecondPosition(GetSimContext(), m_SubdivisionResults[i]); if (!cmpSecondPosition || !cmpSecondPosition->IsInWorld()) continue; CFixedVector3D secondPosition = cmpSecondPosition->GetPosition(); @@ -1102,12 +1105,12 @@ public: else { // Get a quick list of entities that are potentially in range - std::vector ents; - m_Subdivision.GetNear(ents, pos, q.maxRange); + m_SubdivisionResults.clear(); + m_Subdivision.GetNear(m_SubdivisionResults, pos, q.maxRange); - for (size_t i = 0; i < ents.size(); ++i) + for (size_t i = 0; i < m_SubdivisionResults.size(); ++i) { - EntityMap::const_iterator it = m_EntityData.find(ents[i]); + EntityMap::const_iterator it = m_EntityData.find(m_SubdivisionResults[i]); ENSURE(it != m_EntityData.end()); if (!TestEntityQuery(q, it->first, it->second))