diff --git a/Generals/Code/GameEngine/Include/GameLogic/Weapon.h b/Generals/Code/GameEngine/Include/GameLogic/Weapon.h index d75cb276f5..6895677ba1 100644 --- a/Generals/Code/GameEngine/Include/GameLogic/Weapon.h +++ b/Generals/Code/GameEngine/Include/GameLogic/Weapon.h @@ -862,6 +862,11 @@ class WeaponStore : public SubsystemInterface }; std::vector m_weaponTemplateVector; + + // TheSuperHackers @performance IamInnocent 01/01/2026 - Now additionally stores the same weapon templates in a hash map to optimize lookups by name key + typedef std::hash_map, rts::equal_to > WeaponTemplateMap; + WeaponTemplateMap m_weaponTemplateHashMap; + std::list m_weaponDDI; }; diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Weapon.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Weapon.cpp index ff1dbf4ed1..86835e3872 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Weapon.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Weapon.cpp @@ -1438,6 +1438,7 @@ WeaponStore::~WeaponStore() deleteInstance(wt); } m_weaponTemplateVector.clear(); + m_weaponTemplateHashMap.clear(); } //------------------------------------------------------------------------------------------------- @@ -1496,9 +1497,9 @@ const WeaponTemplate *WeaponStore::findWeaponTemplate( const char* name ) const WeaponTemplate *WeaponStore::findWeaponTemplatePrivate( NameKeyType key ) const { // search weapon list for name - for (size_t i = 0; i < m_weaponTemplateVector.size(); i++) - if( m_weaponTemplateVector[ i ]->getNameKey() == key ) - return m_weaponTemplateVector[i]; + WeaponTemplateMap::const_iterator it = m_weaponTemplateHashMap.find(key); + if(it != m_weaponTemplateHashMap.end()) + return it->second; return NULL; @@ -1517,6 +1518,7 @@ WeaponTemplate *WeaponStore::newWeaponTemplate(AsciiString name) wt->m_name = name; wt->m_nameKey = TheNameKeyGenerator->nameToKey( name ); m_weaponTemplateVector.push_back(wt); + m_weaponTemplateHashMap[wt->m_nameKey] = wt; return wt; } diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/Weapon.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/Weapon.h index 6b39c95758..3afebed868 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/Weapon.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/Weapon.h @@ -887,6 +887,11 @@ class WeaponStore : public SubsystemInterface }; std::vector m_weaponTemplateVector; + + // TheSuperHackers @performance IamInnocent 01/01/2026 - Now additionally stores the same weapon templates in a hash map to optimize lookups by name key + typedef std::hash_map, rts::equal_to > WeaponTemplateMap; + WeaponTemplateMap m_weaponTemplateHashMap; + std::list m_weaponDDI; }; diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Weapon.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Weapon.cpp index 7720c5cc71..473f284ab4 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Weapon.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Weapon.cpp @@ -1583,6 +1583,7 @@ WeaponStore::~WeaponStore() deleteInstance(wt); } m_weaponTemplateVector.clear(); + m_weaponTemplateHashMap.clear(); } //------------------------------------------------------------------------------------------------- @@ -1641,9 +1642,9 @@ const WeaponTemplate *WeaponStore::findWeaponTemplate( const char* name ) const WeaponTemplate *WeaponStore::findWeaponTemplatePrivate( NameKeyType key ) const { // search weapon list for name - for (size_t i = 0; i < m_weaponTemplateVector.size(); i++) - if( m_weaponTemplateVector[ i ]->getNameKey() == key ) - return m_weaponTemplateVector[i]; + WeaponTemplateMap::const_iterator it = m_weaponTemplateHashMap.find(key); + if(it != m_weaponTemplateHashMap.end()) + return it->second; return NULL; @@ -1662,6 +1663,7 @@ WeaponTemplate *WeaponStore::newWeaponTemplate(AsciiString name) wt->m_name = name; wt->m_nameKey = TheNameKeyGenerator->nameToKey( name ); m_weaponTemplateVector.push_back(wt); + m_weaponTemplateHashMap[wt->m_nameKey] = wt; return wt; }