用户是如何匹配进入到游戏的?
简介
目前domo中实现了一个完整的游戏,中国象棋,实现了对应用cocos creator实现的客户端。之后做了匹配逻辑,匹配逻辑的表现是仿照LOL英雄联盟做的。
匹配进入游戏流程
- c2s 玩家请求hallserver匹配
- s2s hallserver请求matchserver匹配
- matchserver 定时执行撮合逻辑
- s2s matchserver找到撮合对象后,请求对应gameserver游戏服分配房间,生成token并记录到redis
- s2s matchserver 通知 到对应玩家的hallserver匹配成功
- s2c hallserver 通知 客户端匹配成功
- cs2 客户端请求hallserver接受对局
- s2s hallserver 通知 matchserver接受对局
- s2s matchserver 统计到所有玩家接受对局后,请求对应游戏服记录游戏房间信息,通知玩家对应hallserver对局开始
- s2c hallserver 通知玩家对局开始
流程1 c2s 玩家请求hallserver匹配
涉及skynet_fly技术
* cluster rpc
涉及服务
* hallserver
* matchserver
1 |
|
玩家请求匹配游戏,指定游戏ID,通过游戏ID索引找到对应游戏服名称,然后通过rpc_matchserver_match.match(game_server, player_id)
rpc传递到匹配服。
流程2 s2s hallserver请求matchserver匹配
涉及skynet_fly技术
* cluster rpc
涉及服务
* hallserver
* matchserver
1 |
|
frpc_client:instance("matchserver", "match_m", game_server):one_balance_call_by_name("match", player_id)
这个语句的意思是发给matchserver中的match_m服务one_balance_call_by_name意思是在所有match_m中instance_name为game_server的服务中进行简单轮询负载均衡。
match_m的启动配置
1 |
|
可以看到,match_m启动了2个,一个instance_name = chinese_chess, 一个为 digitalbomb
在我们想为chinese_chess匹配时就是这样调用 frpc_client:instance("matchserver", "match_m", 'chinese_chess'):one_balance_call_by_name("match", player_id)
流程3 s2s matchserver 定时执行撮合逻辑
match_m启动了2个间隔5秒的定时器,一个用于同步指定instance_name游戏服的游戏房间信息用于负载均衡。一个用于撮合匹配。
流程4 s2s matchserver找到撮合对象后,请求对应gameserver游戏服分配房间,生成token并记录到redis
涉及skynet_fly技术
* cluster rpc
* redis script
涉及服务
* hallserver
* matchserver
匹配成功后,会先把玩家剔除出集合,这里需要用到redis的脚本调用,由于这个过程有异步,可能玩家在这个过程中已经取消匹配了,所以需要用脚本检查所有玩家是否存在,然后再剔除出去。
1 |
|
流程5 s2s matchserver 通知 到对应玩家的hallserver匹配成功
剔除之后记录关键的房间信息,然后通过player_id找到玩家对应的大厅服的服务ID,通过byid_mod_send通知到对应的游戏服。
1 |
|
流程6 s2c hallserver 通知 客户端匹配成功
hallserver 再通知玩家匹配成功了
流程7 cs2 客户端请求hallserver接受对局
玩家需要在指定时间内接受对局,超时或者拒绝后,客户端等待定时器结束,进行重试匹配。
流程8 s2s hallserver 通知 matchserver接受对局
match server 收到接受对局,记录接受数量
流程9 s2s matchserver 统计到所有玩家接受对局后,请求对应游戏服记录游戏房间信息,通知玩家对应hallserver对局开始
1 |
|
set_game_room_info 会把房间信息记录到redis,在退出房间的时候清除,这样方便做重连。
流程10 s2c hallserver 通知玩家对局开始
hallserver 在通知玩家进入游戏,此时客户端可以拿着游戏服的host和token去进入游戏了。
重连处理
当玩家重新登录时,hallserver大厅服,会去尝试拿玩家的游戏服房间信息,如果房间还存在会发给玩家进去重连,如果房间已经不存在,删除信息避免玩家不能再进去匹配。