Skip to content

Commit 13de427

Browse files
perf(weaponstore): Optimize WeaponStore::findWeaponTemplatePrivate with hash map lookup (#2042)
1 parent 5deddce commit 13de427

File tree

4 files changed

+20
-6
lines changed

4 files changed

+20
-6
lines changed

Generals/Code/GameEngine/Include/GameLogic/Weapon.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -862,6 +862,11 @@ class WeaponStore : public SubsystemInterface
862862
};
863863

864864
std::vector<WeaponTemplate*> m_weaponTemplateVector;
865+
866+
// TheSuperHackers @performance IamInnocent 01/01/2026 - Now additionally stores the same weapon templates in a hash map to optimize lookups by name key
867+
typedef std::hash_map<NameKeyType, WeaponTemplate*, rts::hash<NameKeyType>, rts::equal_to<NameKeyType> > WeaponTemplateMap;
868+
WeaponTemplateMap m_weaponTemplateHashMap;
869+
865870
std::list<WeaponDelayedDamageInfo> m_weaponDDI;
866871
};
867872

Generals/Code/GameEngine/Source/GameLogic/Object/Weapon.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1438,6 +1438,7 @@ WeaponStore::~WeaponStore()
14381438
deleteInstance(wt);
14391439
}
14401440
m_weaponTemplateVector.clear();
1441+
m_weaponTemplateHashMap.clear();
14411442
}
14421443

14431444
//-------------------------------------------------------------------------------------------------
@@ -1496,9 +1497,9 @@ const WeaponTemplate *WeaponStore::findWeaponTemplate( const char* name ) const
14961497
WeaponTemplate *WeaponStore::findWeaponTemplatePrivate( NameKeyType key ) const
14971498
{
14981499
// search weapon list for name
1499-
for (size_t i = 0; i < m_weaponTemplateVector.size(); i++)
1500-
if( m_weaponTemplateVector[ i ]->getNameKey() == key )
1501-
return m_weaponTemplateVector[i];
1500+
WeaponTemplateMap::const_iterator it = m_weaponTemplateHashMap.find(key);
1501+
if(it != m_weaponTemplateHashMap.end())
1502+
return it->second;
15021503

15031504
return NULL;
15041505

@@ -1517,6 +1518,7 @@ WeaponTemplate *WeaponStore::newWeaponTemplate(AsciiString name)
15171518
wt->m_name = name;
15181519
wt->m_nameKey = TheNameKeyGenerator->nameToKey( name );
15191520
m_weaponTemplateVector.push_back(wt);
1521+
m_weaponTemplateHashMap[wt->m_nameKey] = wt;
15201522

15211523
return wt;
15221524
}

GeneralsMD/Code/GameEngine/Include/GameLogic/Weapon.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -887,6 +887,11 @@ class WeaponStore : public SubsystemInterface
887887
};
888888

889889
std::vector<WeaponTemplate*> m_weaponTemplateVector;
890+
891+
// TheSuperHackers @performance IamInnocent 01/01/2026 - Now additionally stores the same weapon templates in a hash map to optimize lookups by name key
892+
typedef std::hash_map<NameKeyType, WeaponTemplate*, rts::hash<NameKeyType>, rts::equal_to<NameKeyType> > WeaponTemplateMap;
893+
WeaponTemplateMap m_weaponTemplateHashMap;
894+
890895
std::list<WeaponDelayedDamageInfo> m_weaponDDI;
891896
};
892897

GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Weapon.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1583,6 +1583,7 @@ WeaponStore::~WeaponStore()
15831583
deleteInstance(wt);
15841584
}
15851585
m_weaponTemplateVector.clear();
1586+
m_weaponTemplateHashMap.clear();
15861587
}
15871588

15881589
//-------------------------------------------------------------------------------------------------
@@ -1641,9 +1642,9 @@ const WeaponTemplate *WeaponStore::findWeaponTemplate( const char* name ) const
16411642
WeaponTemplate *WeaponStore::findWeaponTemplatePrivate( NameKeyType key ) const
16421643
{
16431644
// search weapon list for name
1644-
for (size_t i = 0; i < m_weaponTemplateVector.size(); i++)
1645-
if( m_weaponTemplateVector[ i ]->getNameKey() == key )
1646-
return m_weaponTemplateVector[i];
1645+
WeaponTemplateMap::const_iterator it = m_weaponTemplateHashMap.find(key);
1646+
if(it != m_weaponTemplateHashMap.end())
1647+
return it->second;
16471648

16481649
return NULL;
16491650

@@ -1662,6 +1663,7 @@ WeaponTemplate *WeaponStore::newWeaponTemplate(AsciiString name)
16621663
wt->m_name = name;
16631664
wt->m_nameKey = TheNameKeyGenerator->nameToKey( name );
16641665
m_weaponTemplateVector.push_back(wt);
1666+
m_weaponTemplateHashMap[wt->m_nameKey] = wt;
16651667

16661668
return wt;
16671669
}

0 commit comments

Comments
 (0)