* Core/ObjectAccessor: optimize FindPlayerByName by saving a map of player names to Player* (#17797)

(cherry picked from commit a893ecebf8)
This commit is contained in:
ariel-
2016-08-17 16:32:47 -03:00
committed by joschiwald
parent f98e3b0ee5
commit a2acd445fe
2 changed files with 51 additions and 29 deletions

View File

@@ -76,6 +76,32 @@ boost::shared_mutex* HashMapHolder<T>::GetLock()
template class TC_GAME_API HashMapHolder<Player>;
template class TC_GAME_API HashMapHolder<Transport>;
namespace PlayerNameMapHolder
{
typedef std::unordered_map<std::string, Player*> MapType;
static MapType PlayerNameMap;
void Insert(Player* p)
{
PlayerNameMap[p->GetName()] = p;
}
void Remove(Player* p)
{
PlayerNameMap.erase(p->GetName());
}
Player* Find(std::string const& name)
{
std::string charName(name);
if (!normalizePlayerName(charName))
return nullptr;
auto itr = PlayerNameMap.find(charName);
return (itr != PlayerNameMap.end()) ? itr->second : nullptr;
}
} // namespace PlayerNameMapHolder
WorldObject* ObjectAccessor::GetWorldObject(WorldObject const& p, ObjectGuid const& guid)
{
switch (guid.GetHigh())
@@ -224,40 +250,16 @@ Player* ObjectAccessor::FindConnectedPlayer(ObjectGuid const& guid)
Player* ObjectAccessor::FindPlayerByName(std::string const& name)
{
boost::shared_lock<boost::shared_mutex> lock(*HashMapHolder<Player>::GetLock());
Player* player = PlayerNameMapHolder::Find(name);
if (!player || !player->IsInWorld())
return nullptr;
std::string nameStr = name;
std::transform(nameStr.begin(), nameStr.end(), nameStr.begin(), ::tolower);
HashMapHolder<Player>::MapType const& m = GetPlayers();
for (HashMapHolder<Player>::MapType::const_iterator iter = m.begin(); iter != m.end(); ++iter)
{
if (!iter->second->IsInWorld())
continue;
std::string currentName = iter->second->GetName();
std::transform(currentName.begin(), currentName.end(), currentName.begin(), ::tolower);
if (nameStr.compare(currentName) == 0)
return iter->second;
}
return NULL;
return player;
}
Player* ObjectAccessor::FindConnectedPlayerByName(std::string const& name)
{
boost::shared_lock<boost::shared_mutex> lock(*HashMapHolder<Player>::GetLock());
std::string nameStr = name;
std::transform(nameStr.begin(), nameStr.end(), nameStr.begin(), ::tolower);
HashMapHolder<Player>::MapType const& m = GetPlayers();
for (HashMapHolder<Player>::MapType::const_iterator iter = m.begin(); iter != m.end(); ++iter)
{
std::string currentName = iter->second->GetName();
std::transform(currentName.begin(), currentName.end(), currentName.begin(), ::tolower);
if (nameStr.compare(currentName) == 0)
return iter->second;
}
return NULL;
return PlayerNameMapHolder::Find(name);
}
HashMapHolder<Player>::MapType const& ObjectAccessor::GetPlayers()
@@ -273,3 +275,17 @@ void ObjectAccessor::SaveAllPlayers()
for (HashMapHolder<Player>::MapType::const_iterator itr = m.begin(); itr != m.end(); ++itr)
itr->second->SaveToDB();
}
template<>
void ObjectAccessor::AddObject(Player* player)
{
HashMapHolder<Player>::Insert(player);
PlayerNameMapHolder::Insert(player);
}
template<>
void ObjectAccessor::RemoveObject(Player* player)
{
HashMapHolder<Player>::Remove(player);
PlayerNameMapHolder::Remove(player);
}

View File

@@ -107,6 +107,12 @@ namespace ObjectAccessor
HashMapHolder<T>::Remove(object);
}
template<>
void AddObject(Player* player);
template<>
void RemoveObject(Player* player);
TC_GAME_API void SaveAllPlayers();
};