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

}

 

posted @ 2014-12-19 10:27  zzyoucan  阅读(213)  评论(0编辑  收藏  举报