1.两个框架 mobile legends { 微服务架构:各系统耦合性低,rpc AccountServer DirServer LoginServer---c(账号认证,角色信息,区服信息) | | ConnServer ConnServer ConnServer---c GameServer GameServer GameServer---SharedMemory---MySql RankServer FriendServer TeamServer MatchServer --- BattleServer BattleServer PingServer BroadServer --- BattleServer BattleServer epoll线程(Server)(1-N) ServiceHandleThread(1-N) epoll线程(Client)(1-N) AsyncRspThread(1-N) 附上一个配置,更好理解 <mfw> <application> setdivision = moba.zone.2006 <client> locator = mfw.mfwregistry.QueryObj@tcp -h 192.168.40.220 -p 2000//注册服务器地址 refresh-endpoint-interval = 60000 sync-invoke-timeout = 3000 async-invoke-timeout = 5000 connect-timeout = 1000 asyncthread = 3 </client> <server> app = MOBA server = GameServer logpath = ~/log loglevel = DEBUG framework-loglevel = INFO log = mfw.mfwlog.LogObj loop-interval = 50 admin = tcp -h 127.0.0.1 -p 0 -t 10000 agent-report = mfw.mfwagent.AgentReportObj@tcp -h 127.0.0.1 -p 2002 -t 3600000 <Service_1> service = MOBA.GameServer.GameServiceObj endpoint = tcp -h 192.168.40.210 -p 2024 -t 600000 protocol = mfw threads = 1 maxconns = 1024 queuecap = 10240 queuetimeout = 5000 </Service_1> </server> </application> </mfw> } 300英雄 { 整体性架构:耦合性高 ShareMemProc:只申请共享内存 LocalSaveServer读取共享内存发送到--->ManagerServer Client | | GateServer(多个)--->AuServer(账号验证) | | | GameDB---ManagerServer--->(GameAIServer,NameServer,CenterServer---GameDB) | | | GameServer(多个)---ShareMemProc----LocalSaveServer IOCP与epoll最大不同:IOCP时间通知时,已经做好了I/O,而epoll,还得自己去读写。 } 2.两个登录流程 mobile legends { DirServer 增加,修改-后台网页操作 维护所有分区的当前信息 创建,修改,上报分区信息 分区:状态,版本号,注册量等 一.loginserver 定时从dir同步所有区服的信息 1.CmdId_Login_Auth_CS->LoginServer 1_1:ip获得国家,然后根据渠道看是否禁止登陆 1_2:到accountserver获取账号信息,创建账号信息 1_3:推荐分区(最近登录的一个分区) 2.CmdId_Login_GetZone_CS->LoginServer获取一个账号的相关角色信息(内网没有调用) 所有区服和角色的基本信息 3.Cmd_Login_CheckUpgrade_CS 各种地址,包括connectserver的地址,cdn头像上传等 4.CmdId_Login_GetBulletin_CS 获得游戏公告 5.Cmd_Login_UpdateDeviceToken_CS(内网没有调用,可能在某些情况下调用) 上报devicetoken 6.Cmd_Login_GetRegion_CS(内网没有调用) 各个大区的信息 二.与connserver连接 CmdId_Net_Connect_CS:连接connserer CmdId_Net_LogReport_CS:上报客户端日志 CmdId_Role_Init_CS:获取角色详细信息 CmdId_Net_Idle_CS:维护客户端连接心跳 CmdId_Account_GetAccount_CS:获取账号相关信息 三.与GameServer连接 CmdId_Net_Connect_CS CmdId_Net_SetSkeyExpireTime_CS:ConnServer 通知 GameServer 过期时间 CmdId_Role_Init_CS CmdId_Account_GetAccount_CS CmdId_Net_ServerTime_CS } 300英雄 { 帐号验证 gate -> client MsgLoginDataWrapper(Sg2cSecretKey) client -> gate MsgLoginDataWrapper(Sc2gReqClientLogin) //登陆消息 gate -> audbgate Sg2aReqClientLogin //验证服务器(通过登陆账号密码返回具体玩家账号信息) audbgate -> gate(Sa2gAckClientLogin) -> client(Sg2cAckClientLogin) //返回具体玩家账号信息 gate -> manager MsgReqLoginCheck manager -> gate MsgAckLoginCheck gate -> manager DBMsgReqGetAllRoles //获取所有角色信息 manager -> db Sm2dReqAllRoles db -> manager Sd2mAckAllRoles manager -> gate MsgResGetAllRoles gate -> client MsgResGetAllRoles 1287 如果m_btRoleNum数量为0则进入创建流程,如果大于0则进入选角色登入流程 登入流程 client -> gate MsgEnterWorld //获取角色信息 gate -> manager DBMsgReqGetOneRole manager -> db Sm2dReqGetOneRole db -> manager Sd2mAckGetOneRole 1、Client-连接->GateServer GateServer保存会话OnNewClientConnected 2、Client-发送MSG_LOGINDATAWRAPPER->GateServer 登陆消息 3、GateServer-登陆消息->AuAgent 验证服务器(通过登陆账号密码返回具体玩家账号信息) 4、AuAgent-返回具体玩家账号信息->GateServer GetAU().Run()-ProcessAUAgentProtocol-通知客户端验证-OnAckLogin-更新1会话 5、ManagerServer-MSG_S2C_RESPONSEGETALLROLES->GateServer ManagerServer发送人物信息给玩家,早期可能是GameServer发送的 6、Client-MSG_ENTERWORLD->GateServer-MSG_GMD_REQUESTGETONEROLE->ManagerServer 获取角色信息 7、ManagerServer-em2dReqGetOneRole->DB(CAccountManager) 向账号管理请求角色信息(DBServerConnector) 8、DB->ed2mAckGetOneRole->ManagerServer DB返回数据至ManagerServer 9、ManagerServer->MSG_DMG_RESPONSEGETONEROLE->GameServer ManagerServer将DB数据组装发给GameServer,GameServer更新玩家信息 10、GameServer-MSG_ACKENTERWORLD->GateServer->Client 进入世界 清除临时登陆信息m_TempSessions、m_LoginSessions 建立以dwPlayerCharacterID为索引的会话m_GameChars } 3.两个战斗流程 mobile legends { 1.创建房间 CmdId_Room_Create_CS 1_1到pingserver获取ping返回(格式:groupid:ping值) 遍历这些battlegroup,检测battlegroup的版本(t_battle_group),在所有battle中找(t_battle_status)这个版本号和状态时正常的,确定本次匹配的matchid CmdId_Room_Enter_CS(单人匹配不会调用) 进入房间,根据模式,判断各种限制条件(段位,版本号等) CmdId_Battle_StartMatch_CS 从roomserver获取房间里面的玩家信息,开始匹配,根据玩家身上存储的matchid选择在哪个matchid进行匹配,会将房间里面的所有玩家信息带到match上 发送CmdId_Match_StartMatch MatchServiceMsg到match上,battlegroup信息也带到match上 根据带到match上的battlegroupu列表,筛选出可用的battlegroup列表(版本号,在线人数),然后同时在这些battlegroup里面匹配,扔到几人匹配的list里面 loop每一帧从list匹配玩家,匹配成功后找到这个battlegroup里面的battle,加入到这个battle上面比赛,在一个battlegroup里面匹配成功了,则删除其他battlegroup里面匹配的该玩家 } 300英雄 { ManagerServer->GameAIServer CELO_Super_Queue-CElo_Base_Queue-m_listNode:不同类型的战斗排队列表 匹配成功 GameAIServer->ManagerServer ManagerServer(m_quAthReady保存已就位的队伍信息)->GameServer GameServer开始创建副本,切线 } 4.玩家数据管理 mobile legends { }