状态同步模式下的游戏掉线重连
来源:互联网 发布:识汝不识丁网络剧微盘 编辑:程序博客网 时间:2024/06/05 07:59
状态同步模型下,所有的游戏逻辑、数据都会保存在服务端。对于开房间式的游戏(比如5V5这类),玩家的状态都可以在每一个房间room内维护着。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
当检测到有玩家触发掉线事件时,首先根据玩家客户端连接的tcp连接号(client_id)去索引到所在的房间,然后从房间内维护的所有玩家的信息列表(players)中找到该玩家,这时候不要将改玩家对象从players中移除,而是采取标记的方式,不如修改player对象的一个状态值为下线状态。这样子设计的好处在于,如果玩家重新连接,可以快速找到掉线前所在的房间,而且不需要再new一个player对象加入到players中去,只需要修改下players中对应的player的在线状态即可。在该player掉线的过程中,room内所有的player一样在进行正常的逻辑运算,如果这时候掉线的player被打死(状态信息发送了变化),等玩家重新连接后边会直接看到被改变后的状态。
但是,这样子会存在一个问题,就是每次断开连接再次连接后,服务端收到的同一个玩家的tcp连接好是发生了变化的。所以,对于player类的设计需要特别注意,我们需要给player设计一个上下线都不变的fixed_client_id,这个值只在第一次刚开房间的时候赋值,之后都不会被改变。之所以需要维护这么一个固定的id号,是因为这类游戏,在客户端也往往会维持这么一份所有玩家的信息表,一般都可以采用不同玩家不同的client_id来索引到客户端中每个敌方单位。但是每次玩家掉线重连后由于更新了client_id,服务端会按照最新的client_id将rpc消息转发给对应的客户端,但是客户端方面存储敌方单位的client_id并没有被更新,这样子往往就无法把敌方单位的操作表现出来。这时候fixed_client_id的作用就体现出来了。在服务器做状态运算时,在修改敌方单位状态的时候,需要把敌方单位的fixed_client_id传给客户端,但是在转发rpc消息时要采用最新的client_id。如此便解决了掉线重连的问题。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 状态同步模式下的游戏掉线重连
- 状态同步模式下的游戏掉线重连
- 多线程下数据状态的同步控制
- 移动游戏 状态同步 帧同步
- 游戏 场景同步 实现(状态同步)
- 游戏后台状态同步与帧同步
- 状态模式--游戏开发
- 游戏编程模式 - 状态模式
- 用户模式下的线程同步
- 用户模式下的线程同步
- Chapter08-用户模式下的线程同步
- 用户模式下的线程同步
- 八、 用户模式下的线程同步
- Windows 内核模式下的线程同步
- 八 用户模式下的线程同步
- 用户模式下的线程同步
- Chapter08-用户模式下的线程同步
- 用户模式下的线程同步
- 第七周 项目一 建立顺序环形队列算法库
- MongoDB操作命令
- 排序- 希尔排序 ShellSort
- 何谓SQLSERVER参数嗅探
- 判断某年月日是当年的第几天
- 状态同步模式下的游戏掉线重连
- 日历控件My97DatePicker使用--onchange不生效
- MongoDB-MongoTemplate之模糊匹配多个字段
- java nio框架Netty
- 20. Valid Parentheses
- vs调试特别慢
- ubuntu 脚本 字符串截取时出现Bad substitution的解决办法
- Android面试收集
- Python——线程