基于帧同步的游戏框架说明
基于帧同步的游戏框架说明
一,关于帧同步和状态同步的比较
帧同步 |
状态同步 |
|
安全性 |
比较差,计算都在客户端,服务器只做转发;有服务器校验的方案,比较繁琐 |
计算都在服务器 可以将重要的判定都由服务器决定 |
网络流量 |
比较小,每一帧只同步玩家的操作指令 |
如果单位数量多,需要同步的数据量会比较大 |
技能实现 |
比较容易,只用客户端实现即可,开发周期短 |
需要服务器和客户端实现相同的运算逻辑,如果是不同的语言相当于要开发两次;另外前后端机制的配合也比较复杂 |
录像回放 |
记录每一帧的指令即可,数据量小 |
不太容易做录像 |
一些限制 |
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
基于帧同步的游戏框架说明相关推荐
- 基于cocos2d-x引擎的游戏框架设计【转载】
http://www.cnblogs.com/lancidie/archive/2013/03/18/2965564.html 基于cocos2d-x引擎的游戏框架设计 移动互联网浪潮正在彻底改变人们 ...
- 帧同步moba游戏的寻路
概述 要求控制的单位移动到一个指定位置,该单位移动结束后在多个平台上获取位置能得到相同的位置数据,即(x,z) 忽略y的原因是控制的单位都是地面运动,不会上天,并且当前版本忽略地图高度 过程 指定位置 ...
- 帧同步 java_游戏同步方案——帧锁定同步
最近毕设准备做一个关注游戏同步方案的 demo,准备选用帧同步.正巧所在组火影手游绝大部分的玩法都是使用帧锁定同步来做的,所以在这记录一下. 概述 帧同步,或者更详细的说是帧锁定同步,是将前端的表现划 ...
- [cocos2dx]基于Cocos2d-x引擎的游戏框架设计
游戏架构与实现 目前,很多基于cocos2d-x的代码基本上仅是对引擎功能的使用,完全不能按照游戏项目的标准来参考.作为游戏项目代码,不仅需要实现游戏的诸多功能,还需要从架构层面,从模块设计的角度来思 ...
- 游戏中的网络同步机制(二) 王者荣耀对帧同步的应用
转载自:https://www.jianshu.com/p/81050871cce7 参考 解密:腾讯如何打造一款实时对战手游 从<王者荣耀>来聊聊游戏的帧同步 <王者荣耀>技 ...
- 【游戏开发】状态同步与帧同步优缺点对比
状态同步 - 优点 1.它的安全性非常高,外挂基本上没有什么能力从中收益. 2.状态同步对于网络的带宽和抖动包有更强的适应能力. 3.在开发游戏过程中,它的断线重连比较快,如果我的游戏崩溃了,客户端重 ...
- 关于游戏帧同步问题的总结
概述 本文介绍了开发帧同步游戏中的一些经验.包括一些开发和测试过程的方法.以及包含在帧同步游戏中使用Unity的物理引擎的可行性分析及遇到的问题. 帧同步的原理简述 要保证各个客户端的游戏表现同步,主 ...
- 帧同步游戏开发基础指南
最近一个月休了个假,体验了一下类似欧洲的田园生活.所以更新几乎荒废了,但是总结和积累是一直持续着的.根据前一阶段对于实时对战游戏的开发思考,写了这一篇入门级的文章,希望能记录下自己的想 ...
- 游戏帧同步和状态同步
在网络游戏中,服务器和客户端的同步技术是一个绕不开的话题,也是在技术选型时,首先需要确定的方案.网游中的同步技术主要有两个技术方向,帧同步和状态同步.本文简单讨论了帧同步和状态同步,整理并对比了他们的 ...
最新文章
- 【NLP】 聊聊NLP中的attention机制
- 零基础学Python:作用域详解
- 《实用技巧》——让你的网站变成响应式的3个简单步骤
- 鸿蒙系统手机现在有什么,华为鸿蒙手机迟迟未来 手机操作系统面临的难点有哪些...
- Spring : Spring @Transactional事物创建
- Go 应用优化“指北”
- ajax fetch api,fetch 简介: 新一代 Ajax API
- Phaser3 场景Scene之间的传值 -- HTML网页游戏开发
- 小h的数列 //差分前缀和的应用(好好看好好学(包括我自己))
- 退役前的做题记录3.0
- 计算机控制总线传输的是,总线,地址总线,数据总线和控制总线
- c语言 鼠标宏,鼠标宏设置软件下载 Mini Mouse Macro(鼠标宏设置工具) v7.2.0.0 免费安装版 下载-脚本之家...
- Python使用超级鹰识别验证码
- linux系统查看usb转串口驱动,Linux下使用USB转串口驱动的方法
- 用户价值分层——基于RFM模型的研究分析
- ggplot绘制箱线图
- python等于号怎么输入_python 中不等于怎么表示
- [转贴]当杀毒软件无能为力时,手动杀毒也许是我的最后救命稻草!
- 通过复制粘贴输入网址
- 使用tesseract识别图片中的文字