Core/ObjectAccessor: optimize FindPlayerByName by saving a map of player names to Player

This commit is contained in:
Aokromes
2016-08-18 09:41:38 +02:00
parent e6c7894be1
commit 8d720ee52f
2 changed files with 51 additions and 29 deletions

View File

@@ -81,6 +81,32 @@ HashMapHolder<Player>::MapType const& ObjectAccessor::GetPlayers()
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())
@@ -226,40 +252,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 nullptr;
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 nullptr;
return PlayerNameMapHolder::Find(name);
}
void ObjectAccessor::SaveAllPlayers()
@@ -270,3 +272,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

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