首页 > 代码库 > share

share

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);        }    }}

 

share