对应room hash对象优化

This commit is contained in:
aozhiwei 2020-05-29 19:46:10 +08:00
parent 9dc9ae6cde
commit 0d06f71e09
2 changed files with 47 additions and 20 deletions

View File

@ -222,7 +222,8 @@ void Room::ShowAndroid(Human* target, int num)
int i = 0; int i = 0;
for (auto& pair : human_hash_) { for (auto& pair : human_hash_) {
Human* hum = pair.second; Human* hum = pair.second;
if (a8::HasBitFlag(hum->status, HS_Disable)) { if (hum->IsAndroid() &&
a8::HasBitFlag(hum->status, HS_Disable)) {
if (hum->born_point) { if (hum->born_point) {
DecBornPointHumanNum(hum->born_point, hum); DecBornPointHumanNum(hum->born_point, hum);
} }
@ -337,7 +338,9 @@ void Room::ScatterDrop(a8::Vec2 center, int drop_id)
for (auto& item : drop_items) { for (auto& item : drop_items) {
a8::Vec2 dir = a8::Vec2::UP; a8::Vec2 dir = a8::Vec2::UP;
dir.Rotate(a8::RandAngle()); dir.Rotate(a8::RandAngle());
DropItem(center + dir * (5 + rand() % 50), std::get<0>(item), std::get<1>(item), std::get<1>(item)); DropItem(center + dir * (5 + rand() % 50),
std::get<0>(item), std::get<1>(item),
std::get<1>(item));
} }
} }
} }
@ -406,7 +409,7 @@ int Room::CreateLoot(int equip_id, a8::Vec2 pos, int count, int equip_lv)
entity->count = count; entity->count = count;
entity->item_level = equip_lv; entity->item_level = equip_lv;
entity->Initialize(); entity->Initialize();
uniid_hash_[entity->entity_uniid] = entity; AddToEntityHash(entity);
grid_service->AddRoomEntity(this, entity); grid_service->AddRoomEntity(this, entity);
entity->BroadcastFullState(this); entity->BroadcastFullState(this);
return entity->entity_uniid; return entity->entity_uniid;
@ -446,7 +449,7 @@ void Room::RemoveObjectLater(RoomEntity* entity)
switch (entity->entity_type) { switch (entity->entity_type) {
case ET_Bullet: case ET_Bullet:
{ {
entity->room->moveable_hash_.erase(entity->entity_uniid); entity->room->RemoveFromMoveableHash((Bullet*)entity);
entity->room->grid_service->DelBullet((Bullet*)entity); entity->room->grid_service->DelBullet((Bullet*)entity);
} }
break; break;
@ -458,8 +461,8 @@ void Room::RemoveObjectLater(RoomEntity* entity)
break; break;
case ET_Player: case ET_Player:
{ {
entity->room->moveable_hash_.erase(entity->entity_uniid); entity->room->RemoveFromMoveableHash((Human*)entity);
entity->room->human_hash_.erase(entity->entity_uniid); entity->room->RemoveFromHuamnHash((Human*)entity);
} }
break; break;
default: default:
@ -468,7 +471,7 @@ void Room::RemoveObjectLater(RoomEntity* entity)
} }
break; break;
} }
entity->room->uniid_hash_.erase(entity->entity_uniid); entity->room->RemoveFromEntityHash(entity);
delete entity; delete entity;
}; };
xtimer.AddDeadLineTimerAndAttach(0, xtimer.AddDeadLineTimerAndAttach(0,
@ -482,7 +485,7 @@ void Room::OnHumanDie(Human* hum)
{ {
--alive_count_; --alive_count_;
--App::Instance()->perf.alive_count; --App::Instance()->perf.alive_count;
alive_human_hash_.erase(hum->entity_uniid); RemoveFromAliveHumanHash(hum);
NotifyUiUpdate(); NotifyUiUpdate();
} }
@ -1228,7 +1231,7 @@ RoomObstacle* Room::InternalCreateObstacle(int id, float x, float y,
if (on_precreate) { if (on_precreate) {
on_precreate(entity); on_precreate(entity);
} }
uniid_hash_[entity->entity_uniid] = entity; AddToEntityHash(entity);
grid_service->AddRoomEntity(this, entity); grid_service->AddRoomEntity(this, entity);
return entity; return entity;
} }
@ -1242,12 +1245,12 @@ void Room::AddObjectLater(RoomEntity* entity)
RoomEntity* entity = (RoomEntity*)param.sender.GetUserData(); RoomEntity* entity = (RoomEntity*)param.sender.GetUserData();
if (entity->entity_type == ET_Bullet) { if (entity->entity_type == ET_Bullet) {
MoveableEntity* moveableentity = (MoveableEntity*)entity; MoveableEntity* moveableentity = (MoveableEntity*)entity;
entity->room->moveable_hash_[entity->entity_uniid] = moveableentity; entity->room->AddToMoveableHash(moveableentity);
} }
entity->room->uniid_hash_[entity->entity_uniid] = entity; entity->room->AddToEntityHash(entity);
entity->room->later_add_hash_.erase(entity->entity_uniid); entity->room->RemoveFromLaterAddHash(entity);
}; };
later_add_hash_[entity->entity_uniid] = entity; AddToLaterAddHash(entity);
xtimer.AddDeadLineTimerAndAttach(0, xtimer.AddDeadLineTimerAndAttach(0,
a8::XParams() a8::XParams()
.SetSender(entity), .SetSender(entity),
@ -1715,12 +1718,12 @@ void Room::EnableHuman(Human* target)
a8::UnSetBitFlag(target->status, HS_Disable); a8::UnSetBitFlag(target->status, HS_Disable);
target->OnEnable(); target->OnEnable();
target->enable_frameno = GetFrameNo(); target->enable_frameno = GetFrameNo();
moveable_hash_[target->entity_uniid] = target; AddToMoveableHash(target);
grid_service->AddHuman(target); grid_service->AddHuman(target);
target->FindLocation(); target->FindLocation();
target->RefreshView(); target->RefreshView();
if (!target->real_dead) { if (!target->real_dead) {
alive_human_hash_[target->entity_uniid] = target; AddToAliveHumanHash(target);
} }
} }
#ifdef DEBUG #ifdef DEBUG
@ -1743,8 +1746,8 @@ void Room::DisableHuman(Human* target)
#endif #endif
if (!a8::HasBitFlag(target->status, HS_Disable)) { if (!a8::HasBitFlag(target->status, HS_Disable)) {
a8::SetBitFlag(target->status, HS_Disable); a8::SetBitFlag(target->status, HS_Disable);
moveable_hash_.erase(target->entity_uniid); RemoveFromMoveableHash(target);
alive_human_hash_.erase(target->entity_uniid); RemoveFromAliveHumanHash(target);
for (auto& cell : target->grid_list) { for (auto& cell : target->grid_list) {
bool has_target = false; bool has_target = false;
for (Human* hum : cell->human_list[room_idx_]) { for (Human* hum : cell->human_list[room_idx_]) {
@ -2359,6 +2362,16 @@ void Room::AddToAccountHash(Player* hum)
accountid_hash_[hum->account_id] = hum; accountid_hash_[hum->account_id] = hum;
} }
void Room::AddToLaterAddHash(RoomEntity* entity)
{
later_add_hash_[entity->entity_uniid] = entity;
}
void Room::AddToRemovedRobotHash(Human* hum)
{
removed_robot_hash_[hum->entity_uniid] = hum;
}
void Room::AddPlayerPostProc(Player* hum) void Room::AddPlayerPostProc(Player* hum)
{ {
if (room_type_ == RT_NewBrid) { if (room_type_ == RT_NewBrid) {
@ -2414,12 +2427,22 @@ void Room::RemoveFromEntityHash(Entity* entity)
uniid_hash_.erase(entity->entity_uniid); uniid_hash_.erase(entity->entity_uniid);
} }
void Room::RemoveFromMoveableHash(Human* hum) void Room::RemoveFromMoveableHash(MoveableEntity* entity)
{ {
moveable_hash_.erase(hum->entity_uniid); moveable_hash_.erase(entity->entity_uniid);
} }
void Room::RemoveFromHuamnHash(Human* hum) void Room::RemoveFromHuamnHash(Human* hum)
{ {
human_hash_.erase(hum->entity_uniid); human_hash_.erase(hum->entity_uniid);
} }
void Room::RemoveFromAliveHumanHash(Human* hum)
{
alive_human_hash_.erase(hum->entity_uniid);
}
void Room::RemoveFromLaterAddHash(RoomEntity* entity)
{
later_add_hash_.erase(entity->entity_uniid);
}

View File

@ -167,9 +167,13 @@ private:
void AddToAliveHumanHash(Human* hum); void AddToAliveHumanHash(Human* hum);
void AddToMoveableHash(MoveableEntity* entity); void AddToMoveableHash(MoveableEntity* entity);
void AddToAccountHash(Player* hum); void AddToAccountHash(Player* hum);
void AddToLaterAddHash(RoomEntity* entity);
void AddToRemovedRobotHash(Human* hum);
void RemoveFromEntityHash(Entity* entity); void RemoveFromEntityHash(Entity* entity);
void RemoveFromMoveableHash(Human* hum); void RemoveFromMoveableHash(MoveableEntity* entity);
void RemoveFromHuamnHash(Human* hum); void RemoveFromHuamnHash(Human* hum);
void RemoveFromAliveHumanHash(Human* hum);
void RemoveFromLaterAddHash(RoomEntity* entity);
void AddPlayerPostProc(Player* hum); void AddPlayerPostProc(Player* hum);