• 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);
            }
        }
    
    }
  • 相关阅读:
    2016.6.26考试
    爆搜。。。。。。。
    9.18目标
    9.17水题总结
    9.16测试
    9.10考试
    jzoj P1163 生日派对灯
    9.04考试总结
    8/8刷题记录
    a[i++]
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4173325.html
Copyright © 2020-2023  润新知