GameServer 号称游戏服务器,是整个服务器的控制 其中驱动的东西很多,网络:DataLayer,接收所有map发到GS过来的包,从网络层接报,数据库:DB,数据库回调驱动,玩家:GameChannel,玩家接报,道具,帮会等定时保存,几个定时器管理,帮助GC发送未发送的数据, 所有的工作都是在GS线程里面做的 是名副其实的服务器 跟GameServer同等重要的要数share了 share做的东西也是相当的多,管理所有玩家通道,跨地图操作,所有地图操作 这边有个很重要的继承就是GameServer继承Share,share到底是干啥的,这个问题由来已久,从我到公司就有了,一直搞不懂,以及GameServer和Share之间的区别,其实share就是上面的作用 至于GS为什么从share继承,GS既然号称游戏服务器当然要驱动所有的东西,包括所有地图发送GS的包,玩家包 至于这么晚才看懂,我只能说有点晚了。就像网络发包那块,磨了那么久 至于发送失败的GC,send_stat hr = m_pDataLayer->SendData(m_nChannelId, pkt.pData, pkt.nSize); 就是应该是共享内存分配不到内存了,然后放到等待队列中让GS去发送 接下来就重点看看这些解包过程 /** *对于商城,道具,组队,帮会都是跨地图的,所以不是写在map中 *对于为什么是跨地图的,在看看 */ void Share::ProcMapSendData() { for(auto itMap : m_mapMap) { MapPkt Pkt; try { for (;;) { if(!itMap.second->RecvData(Pkt)) break; if(Pkt.cmd == ms2gs_转client_cmd) { OnTurnToClient(Pkt.channelId, Pkt.data, Pkt.len);//从GS发送到客户端,至于这个为什么从GS发送,我记得map不是直接发送的吗 } else if(Pkt.cmd == ms2gs_json) { OnJson(Pkt.channelId, Pkt.data, Pkt.len);//据说这些都是在一个线程里面,因为他发包和收包都是在一个线程里面,包括相关操作,所以说在一个线程里面,这样说就是安全的 } else if(ms2gs_db_buff_info == Pkt.cmd)//保存数据库 { OnLeaveMap(Pkt.channelId, Pkt.data, Pkt.len); } else if(ms2gs_obj_leave == Pkt.cmd) //玩家切换地图 { OnEnterNewMap(Pkt.channelId, Pkt.data, Pkt.len); } else if(ms2gs_guild_opt == Pkt.cmd)//帮会操作 { m_spGuildOpt->OnGuildOpt(Pkt.channelId, Pkt.data, Pkt.len); } else if (ms2gs_prop_mgr == Pkt.cmd)//道具操作 { m_spPropManager->OnPropMgrOpt(Pkt.channelId, Pkt.data, Pkt.len); } else if (ms2ms_cmd == Pkt.cmd) { OnTurnToMap(Pkt.mapId, Pkt.data, Pkt.len); } else if (ms2gs_mall_opt == Pkt.cmd)//商城 { m_spMallOpt->OnMallOpt(Pkt.channelId, Pkt.data, Pkt.len); } else if (ms2gs_auction_opt == Pkt.cmd)//拍卖行 { m_spAuctionOpt->OnAuctionOpt(Pkt.channelId, Pkt.data, Pkt.len); } delete[] Pkt.data; Pkt.data = nullptr; } } catch(...) { char sErrMsg[256] = {0}; sprintf(sErrMsg, "【%s】ShareCenter:接收%d地图的 cmd = %d 指令时时出错!", __FUNCTION__, itMap.first, Pkt.cmd); ShuiHu::GetLogger()->Fatal(sErrMsg); safe::error_msg(sErrMsg); } } }