Compare commits

...

2 Commits
master ... hero

Author SHA1 Message Date
aozhiwei
63d9b426aa 1 2021-06-02 11:38:16 +08:00
aozhiwei
c6f6a560bf 添加对象池 2021-06-01 19:13:15 +08:00
6 changed files with 234 additions and 47 deletions

View File

@ -22,6 +22,7 @@
#include "playermgr.h" #include "playermgr.h"
#include "mapmgr.h" #include "mapmgr.h"
#include "entityfactory.h" #include "entityfactory.h"
#include "objectpoolmgr.h"
#include "perfmonitor.h" #include "perfmonitor.h"
#include "ss_msgid.pb.h" #include "ss_msgid.pb.h"
@ -137,6 +138,7 @@ bool App::Init(int argc, char* argv[])
JsonDataMgr::Instance()->Init(); JsonDataMgr::Instance()->Init();
MetaMgr::Instance()->Init(); MetaMgr::Instance()->Init();
EntityFactory::Instance()->Init(); EntityFactory::Instance()->Init();
ObjectPoolMgr::Instance()->Init();
uuid.SetMachineId((node_id - 1) * MAX_NODE_ID + instance_id); uuid.SetMachineId((node_id - 1) * MAX_NODE_ID + instance_id);
RoomMgr::Instance()->Init(); RoomMgr::Instance()->Init();
MapMgr::Instance()->Init(); MapMgr::Instance()->Init();
@ -178,6 +180,7 @@ void App::UnInit()
PlayerMgr::Instance()->UnInit(); PlayerMgr::Instance()->UnInit();
MapMgr::Instance()->UnInit(); MapMgr::Instance()->UnInit();
RoomMgr::Instance()->UnInit(); RoomMgr::Instance()->UnInit();
ObjectPoolMgr::Instance()->UnInit();
EntityFactory::Instance()->UnInit(); EntityFactory::Instance()->UnInit();
MetaMgr::Instance()->UnInit(); MetaMgr::Instance()->UnInit();
JsonDataMgr::Instance()->UnInit(); JsonDataMgr::Instance()->UnInit();

View File

@ -377,11 +377,7 @@ const int ADPLAY_BUFFID = 1006;
const int FIXED_OBJECT_MAXID = 20140; const int FIXED_OBJECT_MAXID = 20140;
#ifdef DEBUG
const int MAX_ROOM_IDX = 100;
#else
const int MAX_ROOM_IDX = 1024; const int MAX_ROOM_IDX = 1024;
#endif
const int VIEW_RANGE = 512; const int VIEW_RANGE = 512;

View File

@ -8,39 +8,51 @@
#include "car.h" #include "car.h"
#include "hero.h" #include "hero.h"
#include "creature.h" #include "creature.h"
#include "objectpoolmgr.h"
GridCell::GridCell() GridCell::GridCell()
{ {
entitys_.reserve(MAX_ROOM_IDX); entitys_.reserve(MAX_ROOM_IDX);
bullets_.reserve(MAX_ROOM_IDX); bullets_.reserve(MAX_ROOM_IDX);
creatures_.reserve(MAX_ROOM_IDX); creatures_.reserve(MAX_ROOM_IDX);
for (int i = 0; i < MAX_ROOM_IDX; ++i) { memset(&entitys_[0], 0, sizeof(std::set<Entity*>*) * MAX_ROOM_IDX);
entitys_.push_back(std::set<Entity*>()); memset(&bullets_[0], 0, sizeof(std::set<Bullet*>*) * MAX_ROOM_IDX);
bullets_.push_back(std::set<Bullet*>()); memset(&creatures_[0], 0, sizeof(std::set<Creature*>*) * MAX_ROOM_IDX);
creatures_.push_back(std::set<Creature*>());
}
} }
void GridCell::ClearRoomData(Room* room) void GridCell::ClearRoomData(Room* room)
{ {
entitys_[room->GetRoomIdx()].clear(); if (entitys_[room->GetRoomIdx()]) {
bullets_[room->GetRoomIdx()].clear(); entitys_[room->GetRoomIdx()]->clear();
creatures_[room->GetRoomIdx()].clear(); ObjectPoolMgr::Instance()->FreeEntitySet(entitys_[room->GetRoomIdx()]);
entitys_[room->GetRoomIdx()] = nullptr;
}
if (bullets_[room->GetRoomIdx()]) {
bullets_[room->GetRoomIdx()]->clear();
ObjectPoolMgr::Instance()->FreeBulletSet(bullets_[room->GetRoomIdx()]);
bullets_[room->GetRoomIdx()] = nullptr;
}
if (creatures_[room->GetRoomIdx()]) {
creatures_[room->GetRoomIdx()]->clear();
ObjectPoolMgr::Instance()->FreeCreatureSet(creatures_[room->GetRoomIdx()]);
creatures_[room->GetRoomIdx()] = nullptr;
}
} }
void GridCell::TraverseHumanList(std::function<void (Human*, bool&)> func, void GridCell::TraverseHumanList(std::function<void (Human*, bool&)> func,
int room_idx, int room_idx,
bool& stop) bool& stop)
{ {
for (Creature* c : creatures_[room_idx]) { if (creatures_[room_idx]) {
if (!c->IsHuman()) { for (Creature* c : *creatures_[room_idx]) {
continue; if (!c->IsHuman()) {
} continue;
Human* hum = (Human*)c; }
func(hum, stop); Human* hum = (Human*)c;
if (stop) { func(hum, stop);
return; if (stop) {
return;
}
} }
} }
} }
@ -49,55 +61,83 @@ void GridCell::TraverseCreatures(std::function<void (Creature*, bool&)>& func,
int room_idx, int room_idx,
bool& stop) bool& stop)
{ {
for (Creature* c : creatures_[room_idx]) { if (creatures_[room_idx]) {
func(c, stop); for (Creature* c : *creatures_[room_idx]) {
if (stop) { func(c, stop);
return; if (stop) {
return;
}
} }
} }
} }
void GridCell::AddBullet(Bullet* bullet) void GridCell::AddBullet(Bullet* bullet)
{ {
bullets_[bullet->room->GetRoomIdx()].insert(bullet); if (!bullets_[bullet->room->GetRoomIdx()]) {
bullets_[bullet->room->GetRoomIdx()] = ObjectPoolMgr::Instance()->AllocBulletSet(this, bullet->room);
}
bullets_[bullet->room->GetRoomIdx()]->insert(bullet);
} }
void GridCell::RemoveBullet(Bullet* bullet) void GridCell::RemoveBullet(Bullet* bullet)
{ {
bullets_[bullet->room->GetRoomIdx()].erase(bullet); if (bullets_[bullet->room->GetRoomIdx()]) {
bullets_[bullet->room->GetRoomIdx()]->erase(bullet);
if (bullets_[bullet->room->GetRoomIdx()]->empty()) {
ObjectPoolMgr::Instance()->FreeBulletSet(bullets_[bullet->room->GetRoomIdx()]);
bullets_[bullet->room->GetRoomIdx()] = nullptr;
}
}
} }
void GridCell::AddPermanentEntity(Entity* entity) void GridCell::AddPermanentEntity(Entity* entity)
{ {
entitys_[0].insert(entity); if (!entitys_[0]) {
entitys_[0] = new std::set<Entity*>;
}
entitys_[0]->insert(entity);
} }
void GridCell::AddRoomEntity(Room* room, Entity* entity) void GridCell::AddRoomEntity(Room* room, Entity* entity)
{ {
entitys_[room->GetRoomIdx()].insert(entity); if (!entitys_[room->GetRoomIdx()]) {
entitys_[room->GetRoomIdx()] = ObjectPoolMgr::Instance()->AllocEntitySet(this, room);
}
entitys_[room->GetRoomIdx()]->insert(entity);
} }
void GridCell::RemoveRoomEntity(Room* room, Entity* entity) void GridCell::RemoveRoomEntity(Room* room, Entity* entity)
{ {
entitys_[room->GetRoomIdx()].erase(entity); if (entitys_[room->GetRoomIdx()]) {
entitys_[room->GetRoomIdx()]->erase(entity);
if (entitys_[room->GetRoomIdx()]->empty()) {
ObjectPoolMgr::Instance()->FreeEntitySet(entitys_[room->GetRoomIdx()]);
entitys_[room->GetRoomIdx()] = nullptr;
}
}
} }
bool GridCell::EntityExists(Room* room, Entity* entity) bool GridCell::EntityExists(Room* room, Entity* entity)
{ {
if (entitys_[0].find(entity) != entitys_[0].end()) { if (entitys_[0] && entitys_[0]->find(entity) != entitys_[0]->end()) {
return true; return true;
} }
return entitys_[room->GetRoomIdx()].find(entity) != if (!entitys_[room->GetRoomIdx()]) {
entitys_[room->GetRoomIdx()].end(); return false;
}
return entitys_[room->GetRoomIdx()]->find(entity) !=
entitys_[room->GetRoomIdx()]->end();
} }
void GridCell::TraverseLayer0EntityList(std::function<void (Entity*, bool&)>& func, void GridCell::TraverseLayer0EntityList(std::function<void (Entity*, bool&)>& func,
bool& stop) bool& stop)
{ {
for (Entity* entity : entitys_[0]) { if (entitys_[0]) {
func(entity, stop); for (Entity* entity : *entitys_[0]) {
if (stop) { func(entity, stop);
return; if (stop) {
return;
}
} }
} }
} }
@ -106,10 +146,12 @@ void GridCell::TraverseLayer1EntityList(std::function<void (Entity*, bool&)>& fu
int room_idx, int room_idx,
bool& stop) bool& stop)
{ {
for (Entity* entity : entitys_[room_idx]) { if (entitys_[room_idx]) {
func(entity, stop); for (Entity* entity : *entitys_[room_idx]) {
if (stop) { func(entity, stop);
return; if (stop) {
return;
}
} }
} }
} }
@ -126,15 +168,27 @@ void GridCell::TraverseAllLayerEntityList(std::function<void (Entity*, bool&)>&
void GridCell::AddCreature(Creature* c) void GridCell::AddCreature(Creature* c)
{ {
creatures_[c->room->GetRoomIdx()].insert(c); if (!creatures_[c->room->GetRoomIdx()]) {
creatures_[c->room->GetRoomIdx()] = ObjectPoolMgr::Instance()->AllocCreatureSet(this, c->room);
}
creatures_[c->room->GetRoomIdx()]->insert(c);
} }
void GridCell::RemoveCreature(Creature* c) void GridCell::RemoveCreature(Creature* c)
{ {
creatures_[c->room->GetRoomIdx()].erase(c); if (creatures_[c->room->GetRoomIdx()]) {
creatures_[c->room->GetRoomIdx()]->erase(c);
if (creatures_[c->room->GetRoomIdx()]->empty()) {
ObjectPoolMgr::Instance()->FreeCreatureSet(creatures_[c->room->GetRoomIdx()]);
creatures_[c->room->GetRoomIdx()] = nullptr;
}
}
} }
bool GridCell::CreatureExists(Creature* c) bool GridCell::CreatureExists(Creature* c)
{ {
return creatures_[c->room->GetRoomIdx()].find(c) != creatures_[c->room->GetRoomIdx()].end(); if (!creatures_[c->room->GetRoomIdx()]) {
return false;
}
return creatures_[c->room->GetRoomIdx()]->find(c) != creatures_[c->room->GetRoomIdx()]->end();
} }

View File

@ -39,7 +39,7 @@ public:
bool& stop); bool& stop);
private: private:
std::vector<std::set<Entity*>> entitys_; std::vector<std::set<Entity*>*> entitys_;
std::vector<std::set<Bullet*>> bullets_; std::vector<std::set<Bullet*>*> bullets_;
std::vector<std::set<Creature*>> creatures_; std::vector<std::set<Creature*>*> creatures_;
}; };

View File

@ -0,0 +1,99 @@
#include "precompile.h"
#include <a8/timer.h>
#include "objectpoolmgr.h"
void ObjectPoolMgr::Init()
{
free_entitys_.reserve(1024 * 4);
free_bullets_.reserve(1024 * 4);
free_creatures_.reserve(1024 * 4);
a8::Timer::Instance()->AddRepeatTimer
(1000 * 10,
a8::XParams(),
[] (const a8::XParams& param)
{
ObjectPoolMgr::Instance()->GcTimerFunc();
});
}
void ObjectPoolMgr::UnInit()
{
}
std::set<Entity*>* ObjectPoolMgr::AllocEntitySet(GridCell* cell, Room* room)
{
if (free_entitys_.empty()) {
return new std::set<Entity*>();
}
std::set<Entity*>* p = free_entitys_[free_entitys_.size() - 1];
free_entitys_.erase(free_entitys_.begin() + free_entitys_.size() - 1);
return p;
}
std::set<Bullet*>* ObjectPoolMgr::AllocBulletSet(GridCell* cell, Room* room)
{
if (free_bullets_.empty()) {
return new std::set<Bullet*>();
}
std::set<Bullet*>* p = free_bullets_[free_bullets_.size() - 1];
free_bullets_.erase(free_bullets_.begin() + free_bullets_.size() - 1);
return p;
}
std::set<Creature*>* ObjectPoolMgr::AllocCreatureSet(GridCell* cell, Room* room)
{
if (free_creatures_.empty()) {
return new std::set<Creature*>();
}
std::set<Creature*>* p = free_creatures_[free_creatures_.size() - 1];
free_creatures_.erase(free_creatures_.begin() + free_creatures_.size() - 1);
return p;
}
void ObjectPoolMgr::FreeEntitySet(std::set<Entity*>* p)
{
free_entitys_.push_back(p);
}
void ObjectPoolMgr::FreeBulletSet(std::set<Bullet*>* p)
{
free_bullets_.push_back(p);
}
void ObjectPoolMgr::FreeCreatureSet(std::set<Creature*>* p)
{
free_creatures_.push_back(p);
}
void ObjectPoolMgr::GcTimerFunc()
{
{
int count = 0;
while (free_entitys_.size() > 5000 && count < 100) {
std::set<Entity*>* p = free_entitys_[free_entitys_.size() - 1];
delete p;
free_entitys_.erase(free_entitys_.begin() + free_entitys_.size() - 1);
++count;
}
}
{
int count = 0;
while (free_bullets_.size() > 5000 && count < 100) {
std::set<Bullet*>* p = free_bullets_[free_bullets_.size() - 1];
delete p;
free_bullets_.erase(free_bullets_.begin() + free_bullets_.size() - 1);
++count;
}
}
{
int count = 0;
while (free_creatures_.size() > 5000 && count < 100) {
std::set<Creature*>* p = free_creatures_[free_creatures_.size() - 1];
delete p;
free_creatures_.erase(free_creatures_.begin() + free_creatures_.size() - 1);
++count;
}
}
}

View File

@ -0,0 +1,35 @@
#pragma once
class GridCell;
class Room;
class Entity;
class Bullet;
class Creature;
class ObjectPoolMgr : public a8::Singleton<ObjectPoolMgr>
{
private:
ObjectPoolMgr() {};
friend class a8::Singleton<ObjectPoolMgr>;
public:
void Init();
void UnInit();
std::set<Entity*>* AllocEntitySet(GridCell* cell, Room* room);
std::set<Bullet*>* AllocBulletSet(GridCell* cell, Room* room);
std::set<Creature*>* AllocCreatureSet(GridCell* cell, Room* room);
void FreeEntitySet(std::set<Entity*>* p);
void FreeBulletSet(std::set<Bullet*>* p);
void FreeCreatureSet(std::set<Creature*>* p);
private:
void GcTimerFunc();
private:
std::vector<std::set<Entity*>*> free_entitys_;
std::vector<std::set<Bullet*>*> free_bullets_;
std::vector<std::set<Creature*>*> free_creatures_;
};