基于帧同步的游戏框架说明

一,关于帧同步和状态同步的比较

帧同步

状态同步

安全性

比较差,计算都在客户端,服务器只做转发;有服务器校验的方案,比较繁琐

计算都在服务器 可以将重要的判定都由服务器决定

网络流量

比较小,每一帧只同步玩家的操作指令

如果单位数量多,需要同步的数据量会比较大

技能实现

比较容易,只用客户端实现即可,开发周期短

需要服务器和客户端实现相同的运算逻辑,如果是不同的语言相当于要开发两次;另外前后端机制的配合也比较复杂

录像回放

记录每一帧的指令即可,数据量小

不太容易做录像

一些限制

1,随机种子要一致,不能使用浮点数,导致在游戏逻辑层使用外部库要注意,包括物理引擎之类的都禁止使用;

2,代码要求比较高,如果出现异常就会出现玩家之间数据不一致,导致战斗结果无效。

3,断线重连比较复杂,通常需要客户端重头跑帧指令。

没有要求

二,实际项目《战争XX》帧同步方案分析

1,整体架构:

2,游戏类型是一款在moba游戏上加入rts元素的实时对战游戏,支持1v1,2v2的模式。

3,关于lockstep

简单的说就是游戏时间划分成一个一个的turn,每个trun玩家发送指令给服务器,服务器收集每个玩家的指令,在这一帧末尾广播给所有玩家;客户端收到指令后,执行相应的指令;

因为么个客户端的开始状态一致,那么经过相同的指令计算后,状态也应该是一致的;这就是帧同步的核心原理。

原始的lockstep要求每一个turn会等待所有玩家的指令,如果有一个玩家卡顿了,其他玩家也会受到影响;我们针对这种情况作了改进,如果超过一定时间就认为这个客户端这一帧没有做操作,

从而不会影响其他玩家。

4,模块说明

loginserver:  登录服务器,负责接入第三方账户系统登录

logicserver:大厅服务器,负责养成逻辑,可以横向扩展多个;基于skynet

gamecenter: 中心服务器,负责全局性的功能,如玩家状态管理,帮会,匹配等;基于skynet,可以按功能扩展

battleserver:战斗服务器,负责战斗过程,基于c++;核心逻辑是基于房间的概念,每场战斗就是一个房间,房间内的玩家进行帧同步处理

checkserver:验证服务器,负责验算战斗过程,用于当客户端战斗结果不一致的时候,服务器校验

replaycenter:验证中心服务器,负责管理验证服务器,负载均衡

5,一场战斗的生命周期

gamecenter匹配好一场战斗之后,根据负载均衡选择一个battleserver,将玩家信息发送给battleserver;

battleserver根据玩家信息创建一个房间room和玩家对象,返回给gamecenter战斗服地址;

gamecenter通过logicserver返回地址给客户端;

客户端连接战斗服,并且加载对应的战斗地图,加载过程会广播给其他玩家;

当一个房间中所有玩家都加载完成,战斗服务器广播战斗开始;

战斗中每秒15帧,每一帧会收集所有玩家的操作指令,在帧末尾广播出去;

帧指令需要缓存,因为需要做断线重连;

为了高效的管理这个缓存,这里设计了一个专门为此服务的内存池,每次分配一个固定块的内存,用链表记录起来;每次分配就从块内存中分配,不够再向系统申请;

当战斗结束的时候,直接将链表中所有的块内存全部释放。

当客户端判断战斗结束,会给服务器发送战斗结束协议;战斗服务器将战斗结果发送给gamecenter,即可结束这一场战斗。

6,关于作弊检查

客户端每一帧会将关键状态序列化计算md5发送给战斗服务器,战斗服务器每一帧会收集到每个客户端的md5;如果md5不一致即可知道有客户端状态不一致;

如果是2v2,我们可以用其中三个md5的一致来判断一个不一致的人客户端出问题了,这种情况会丢弃有问题的客户端的战斗结果。

如果是1v1,我们不能通过md5的方式知道正确的客户端。此时会用到checkserver,这个服务器上跑了客户端的战斗逻辑,得益于将战斗逻辑独立成一个lib,

我们在ubuntu系统上安装mono运行环境可以在服务器上跑战斗过程,就是将帧指令发送给checkserver验算战斗结果。缺点就是内存占用比较大,一场战斗内存在15M左右;

因此我们先通过第一种方式来检查,实在不行才启用第二种方式。

7,关于客户端

客户端需要将逻辑和表现分开,逻辑层每一帧会根据收到的服务器指令来更新逻辑状态;由服务器帧来驱动逻辑运算,要考虑由于网络波动造成的帧信号时快时慢,

逻辑循环要针对这种情况做快进或者等待;表现层考虑手感优先需要对玩家操作的单位快速做出响应,表现都是不用等待服务器状态的。比如移动,

客户端本地是可以自由操作自己控制的单位。表现层需要对玩家移动过程进行差值计算等,因为逻辑帧通常低于表现帧。另外表现层玩家坐标要考虑跟逻辑层的差异,

允许一定的误差,误差过大要考虑如何缩小;目前的处理就是当玩家停止移动的时候,跟服务器这一帧的状态同步一次,差异比较小的时候,玩家不会有明显的感觉。

参考资料:

王者荣耀后台分享 - 腾讯游戏学堂

游戏中的网络同步机制——Lockstep

基于帧同步的游戏框架说明相关推荐

  1. 基于cocos2d-x引擎的游戏框架设计【转载】

    http://www.cnblogs.com/lancidie/archive/2013/03/18/2965564.html 基于cocos2d-x引擎的游戏框架设计 移动互联网浪潮正在彻底改变人们 ...

  2. 帧同步moba游戏的寻路

    概述 要求控制的单位移动到一个指定位置,该单位移动结束后在多个平台上获取位置能得到相同的位置数据,即(x,z) 忽略y的原因是控制的单位都是地面运动,不会上天,并且当前版本忽略地图高度 过程 指定位置 ...

  3. 帧同步 java_游戏同步方案——帧锁定同步

    最近毕设准备做一个关注游戏同步方案的 demo,准备选用帧同步.正巧所在组火影手游绝大部分的玩法都是使用帧锁定同步来做的,所以在这记录一下. 概述 帧同步,或者更详细的说是帧锁定同步,是将前端的表现划 ...

  4. [cocos2dx]基于Cocos2d-x引擎的游戏框架设计

    游戏架构与实现 目前,很多基于cocos2d-x的代码基本上仅是对引擎功能的使用,完全不能按照游戏项目的标准来参考.作为游戏项目代码,不仅需要实现游戏的诸多功能,还需要从架构层面,从模块设计的角度来思 ...

  5. 游戏中的网络同步机制(二) 王者荣耀对帧同步的应用

    转载自:https://www.jianshu.com/p/81050871cce7 参考 解密:腾讯如何打造一款实时对战手游 从<王者荣耀>来聊聊游戏的帧同步 <王者荣耀>技 ...

  6. 【游戏开发】状态同步与帧同步优缺点对比

    状态同步 - 优点 1.它的安全性非常高,外挂基本上没有什么能力从中收益. 2.状态同步对于网络的带宽和抖动包有更强的适应能力. 3.在开发游戏过程中,它的断线重连比较快,如果我的游戏崩溃了,客户端重 ...

  7. 关于游戏帧同步问题的总结

    概述 本文介绍了开发帧同步游戏中的一些经验.包括一些开发和测试过程的方法.以及包含在帧同步游戏中使用Unity的物理引擎的可行性分析及遇到的问题. 帧同步的原理简述 要保证各个客户端的游戏表现同步,主 ...

  8. 帧同步游戏开发基础指南

            最近一个月休了个假,体验了一下类似欧洲的田园生活.所以更新几乎荒废了,但是总结和积累是一直持续着的.根据前一阶段对于实时对战游戏的开发思考,写了这一篇入门级的文章,希望能记录下自己的想 ...

  9. 游戏帧同步和状态同步

    在网络游戏中,服务器和客户端的同步技术是一个绕不开的话题,也是在技术选型时,首先需要确定的方案.网游中的同步技术主要有两个技术方向,帧同步和状态同步.本文简单讨论了帧同步和状态同步,整理并对比了他们的 ...

最新文章

  1. 【NLP】 聊聊NLP中的attention机制
  2. 零基础学Python:作用域详解
  3. 《实用技巧》——让你的网站变成响应式的3个简单步骤
  4. 鸿蒙系统手机现在有什么,华为鸿蒙手机迟迟未来 手机操作系统面临的难点有哪些...
  5. Spring : Spring @Transactional事物创建
  6. Go 应用优化“指北”
  7. ajax fetch api,fetch 简介: 新一代 Ajax API
  8. Phaser3 场景Scene之间的传值 -- HTML网页游戏开发
  9. 小h的数列 //差分前缀和的应用(好好看好好学(包括我自己))
  10. 退役前的做题记录3.0
  11. 计算机控制总线传输的是,总线,地址总线,数据总线和控制总线
  12. c语言 鼠标宏,鼠标宏设置软件下载 Mini Mouse Macro(鼠标宏设置工具) v7.2.0.0 免费安装版 下载-脚本之家...
  13. Python使用超级鹰识别验证码
  14. linux系统查看usb转串口驱动,Linux下使用USB转串口驱动的方法
  15. 用户价值分层——基于RFM模型的研究分析
  16. ggplot绘制箱线图
  17. python等于号怎么输入_python 中不等于怎么表示
  18. [转贴]当杀毒软件无能为力时,手动杀毒也许是我的最后救命稻草!
  19. 通过复制粘贴输入网址
  20. 使用tesseract识别图片中的文字

热门文章

  1. 『C Free 5.0 注册码共享』
  2. 通讯录管理系统程序开发
  3. word根据关键字盖章(图片)
  4. VMware16安装Centos8配置
  5. 联想服务器配置RAID
  6. echarts自适应字体大小
  7. 【电气专业知识问答】问:电力变压器的不正常工作状态和可能发生的故障有哪些?一般应装设哪些保护?
  8. 计算机打印稿,计算机如何打印演示文稿?
  9. Visio画图-批量处理图片同等大小、等行距、等列距
  10. 【Android App】人脸识别中使用Opencv比较两张人脸相似程度实战(附源码和演示 超详细)