main()
{
initCfgData();//读配置数据到内存
//一堆servervice开始工作,实际每个service只有一个,为了后续的可扩展性,每个manager维护一个service容器来管理,
dbService();
globalService();
centerService();
helpService();
gameService();
....;
startMapServices();//map部分
}
MapsManager.startMap(xx);
for(allmaps)
{
NormalMapService* nms = new NormalMapService();
nms->init();//每个map对应一对配置数据,CfgMap* m_pCfgMap = xxx;初始化就是把配置数据链过去
nms->start();
}
NormalMapService:MapServiceBase:Thread
也就是说,m个地图就对应m个线程,每个独立update,
MapServiceBase::run()
{
m_running = true;
while(m_running)
{
update();//对应的maps update,当前实际是一个,一个mapservice对应一个map
checkMessage();//处理所有发到我这个线程的消息
sleep(10);
}
}
其他地方发来的消息比如
pMapService->postMessage(msg,xxxx);
//message_queue和messgae_pool相互配合
void postMessage(msg)
{
GameMsg* msg = m_pool.pop();//新消息过来,从池子取出一个钥匙,给指向的空间重新赋值,然后放入消息队列,省的频繁new
if(msg!=NULL)
{
m_msgQueue.push(msg);//放到这里面表示进入处理队列了,排队处理
}
}
void checkMessages()
{
//所有来的消息放在一个队列里面,然后我在循环里面处理这些消息,FIFO
GameMsg* msg=bull;
while((msg=m_msgQueue.pop()) != NULL)
{
dealMessage(msg);//switch case,什么msg做什么事
m_pool.push(msg);//处理完后放入池子,不delete,等新消息到来,拿出去重新赋值继续用
}
}
void map::update()
{
if(这片地图有玩家)
{
updateMonsters();//m_aliveMonsters,m_deadMonsters.update
updatePlayers();//m_players.update
updatePets();
updatePlants();
updateDropItems();//m_dropItems
//怪物,玩家,宠物,植物,掉落物等等
。。。。
//这些update里面实际就是 map里面的成员entity每个都update
}
}
map的部分成员变量
{
m_dropItems;//当前地图上面的掉落物
m_aliveMonsters;//当前地图上面活着的怪物
xx//死了的怪物
m_players;//当前地图上的玩家角色
}