帧同步在竞技类网络游戏中的应用

帧同步在竞技类网络游戏中的应用

帧同步在网上可以搜的资料比较少,关于游戏的更是没有,不过,实现的原理也比较简单,最近几天就写了份关于帧同步的文档,当作给同事扫扫盲,顺便也在这里发发,可以给其他人参考参考

    --竞技类网络游戏设计方案

 

一、        前言

帧同步,根据wiki百科的定义是,一种对同步源进行像素级同步显示的处理技术,对于网络上的多个接入者,一个信号将会通过主机同步发送给其他人,并同步显示在各个终端上。同步信号可以是每帧的像素数据,也可以是影响数据变化的关键事件信息。

帧同步在网络游戏中的应用,设计上有异于传统的mmorpg游戏,因为可以承载更大量的后台计算,实现类单机的效果,所以可应用在类似射击类、飞机类中实现弹幕计算或者格斗类的高精度打击体验

本文将主要介绍下帧同步与传统mmorpg设计框架的异同点以及相关的几个设计方案,最后,深入展开对其中一种实现方案的分析,而相关的反外挂和断线重连机制等技术难点暂不在本文讨论。

二、        帧同步在游戏中的应用

网络游戏中,游戏服务的架构大致可以分为2种模式,分别是cs模式和p2p模式

cs模式框架如1(c为客户, GSS为游戏状态服务器)

图1

1,游戏状态服务器(GSS)单独部署,负责对网络上各个接入者提供服务,当GSS状态发生变化时,将状态同步发送给各个接收者。

p2p模式框架如2(c为客户,GSS为游戏状态服务器):

图2

图2中,游戏状态服务器存在于各个客户主机上,游戏状态的改变直接来自于各个客户端的输入。

以上2个服务框架中,cs模式,由于GSS服务器只有一个,游戏状态能保证绝对一致,但GSS可能同时服务上万个玩家,由于机器性能以及网络带宽等硬件资源限制,服务器对大部分情况都无法进行非常严格的检查和处理;p2p模式相对于cs模式,同时连接的玩家有限,所以可以进行比较精细的运算,可实现类似射击类、飞机类的弹幕计算或者格斗类的高精度打击体验,但是,由于端到端的通讯方式,随着同时接入用户的增加,通讯量呈指数级增长,所以,其对同时接入的数量上会限制得比较严格,适合少量同屏的竞技类等游戏。

p2p模式中,由于存在多份的GSS,如何保证各个GSS一致也需要特殊考虑,       帧同步算法在游戏中的应用,主要就是为了解决p2p模式下的GSS一致性问题。实现原理是将游戏处理细化为帧,对于每帧,在同样的运行环境中,保证同样的输入的情况下,将得到同样的输出结果。

图3

图3中,初始状态都为1,序列帧第二帧时,输入加1操作,则状态变为2,第三帧时无输入,状态不变,第四帧时,输入加1操作,状态变为3.对于同个运行环境的各个客户端来说,相同的输入状况下,将得到相关的输出结果,如4效果。

图4

通常,为了用户的输入能及时的响应以及游戏状态的过度能够平滑,会将GSS设置为20到30帧以上。并且,由于客户端机器性能或者设置的差异,GSS的状态无法与游戏渲染帧实现一一对应,所以,GSS与表现层必须做到完全的分离,否则将因为某些细小的误差被放大最终导致游戏出现完全不同的结果。

图5

5,非确定的渲染层的输出,完全由GSS来驱动,GSS保证帧数的稳定,即使出现网络延迟,也必须在确保收到该帧的所有输入后才执行该帧的处理。

实现方案上,大致可以分出3种,分别是无主机结构、有主机结构、服务器主机结构

u  无主机结构

2的拓扑结构中,所有GSS功能对等,该方案需要进行特殊的对帧处理,确保所有客户端都已经同步并且收到所有的输入。但是,由于网络上的各个客户端完全对等,一旦某个用户网络状况出现延迟或者中断等异常,将影响其他用户的操作体验,所以该方案简单公平但体验容易受限

u  有主机结构

图6

6,在各个客户端中随机选择一个的GSS作为主机,同时负责对帧控制及输入输出管理,其他GSS仅跟GSS主机通讯,GSS之间互相不通讯。该方案的好处是,游戏的体验只受主机与本机的网络与本机器状况的影响,其他GSS出现的任何故障都不会影响其他人,当GSS主机完全失去联系时,其他GSS也可以重新仲裁得出新的GSS主机来,但该结构主机在客户端,容易给外挂有可乘之机,对输入对帧等能进行特殊处理,最终导致游戏丧失公平性。此方案能保证玩家体验,但安全性较低

u  服务器主机结构

服务器主机结构,是将6的结构中的GSS主机的的对帧控制及输入输出管理功能放在服务器上,降低GSS客户端的客观影响,保证了大部分玩家的体验,且其中有玩家作弊,也能马上检测到,保证游戏的公平性,但结构上已脱离p2p设计,通讯流量随用户增加,负额指数级增长。该方案安全性高,保证玩家体验,但对服务负载有一定的要求。

u  其他

融合有/无主机与服务器主机的结构。服务器主机结构的特点在于控制权在服务端,在有状态的网络游戏中,可以有效防止游戏数据修改、游戏加速等外挂,在服务端硬件资源方面,可以增加有/无主机结构减轻负担,大部分功能用有/无主机结构处理,关键操作由服务器主机结构处理等,让GSS主机与服务器主机协同服务

三、        服务器主机结构设计

服务器主机结构的特点如上所述,这里再深入展开对该结构的分析与设计。

服务器设计

图7

服务器主要是起到控制作用,进行客户端的对帧控制和输入输出管理。如7服务器每帧都发驱动帧驱动客户端执行帧处理,当客户端有输入被服务器接收到,则服务器当前帧内将输入同步输出给各个客户端.

网络上由于客户端的状况多种多样,客户端帧数可能跟不上服务器,如8所示,如果客户端出现掉帧情况,则在收到驱动帧后需要加速执行,以追上其他客户端的速度,避免掉帧的用户一直在对过去的事件进行响应。

游戏应该优先保证正常用户的体验,所以当有玩家出现卡帧情况的时候,不应选择暂停其他玩家,而是让他慢慢的追赶上来,设计上,服务器即可以采用客户端的正常速度,按帧驱动客户端,但当网络都出现突发状况的时候,如9,通讯异常时,2个客户端都对帧数2缺失,如果服务器照常运行,到恢复网络状况时,会出现情况是,每个客户端都卡了几帧之后,加速拉了几帧。所以,针对这种情况,增加客户端的对帧操作,即客户端执行第1帧时,跟服务器说可以播放第二帧了,然后服务器开始驱动第二帧动作,考虑网络延迟情况,可以提前对帧第n帧的,效果如9,左边客户端第二个对帧操作使服务器开始推动第二帧进行,而右边客户端的第二个对帧动作其实不起任何作用

图8

图9

伪代码

 代码不贴了

客户端设计

图10

客户端设计由两部分组成,分别是GSS模块和渲染模块。

GSS模块包含物品系统、角色系统、AI系统、场景系统还有其他相关系统等,同时,输入输出和帧数控制也一起集成在GSS模块中。GSS中各系统功能分别是:

物品系统:       游戏物品以及物品的效果

角色系统:       角色包括玩家角色、npc及apc等

ai系统:          驱动apc行动的控制模块

场景系统:     场景物件、地图、寻路等

其他系统:      其他类似技能、状态等系统

输入输出模块:       监听玩家输入,将玩家输入上报服务器,同时监听服务器输入,绑定当前帧输出

帧数控制模块:      监听服务器驱动帧,驱动执行每帧处理

GSS模块中各个系统的执行,由帧数驱动,不引入其他时间线。有如物品持续时间、状态持续时间等都以帧数作为唯一的时间轴。帧与帧之间的播放频率,则由服务器统一控制,但由于网络抖动等影响,帧的频率并不是太稳定,为避免播放抖动,帧数控制器需要进行一定的平滑处理。

图11

客户端的渲染层,由GSS模块驱动,为减少模块间的耦合,GSS模块使用事件通知机制驱动渲染层表现。具体细分事件类型如12(具体项目具体事件拆解)

由于渲染层与GSS只做到事务级的同步,而GSS与渲染层的播放速率有可能不同,则为保证较好的表现效果,GSS的逻辑帧需要与渲染层的渲染帧做固定比率的绑定,譬如13的1:2,当GSS逻辑帧数不变的情况下,渲染帧掉帧时,能经过换算得到当前逻辑帧对应的渲染帧数,出现GSS帧数暂停时,则逻辑帧也跟着一起暂停

图13

逻辑帧与渲染帧绑定算法(伪代码)

代码不贴了

其中  OnUpdate由引擎在每帧调用,GetNewestFrame获得逻辑帧通知过来的最新帧,这样,保证了逻辑帧中关键帧进行伤害计算时,渲染帧不会脱帧严重。

四、        反外挂与断线重连

稍等后续文章

时间: 2024-10-12 22:46:30

帧同步在竞技类网络游戏中的应用的相关文章

Unity 3D实现帧同步技术

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 现在竞技类网络游戏比较火,市面上也出现了很多这种类型的游戏竞赛,提到网络游戏就回避不了一个问题:同步技术,多个人在一个游戏场景围攻一个怪物或者说多人组队战斗等等.现在在移动端的游戏由

机器学习竞赛分享:通用的团队竞技类的数据分析挖掘方法

前言 该篇分享来源于NFL竞赛官方的R语言版本,我做的主要是翻译为Python版本: 分享中用到的技巧.构建的特征.展示数据的方式都可以应用到其他领域,比如篮球.足球.LOL.双人羽毛球等等,只要是团队竞技,都可以从中获益: 分享基于kaggle上的NFL大数据碗,也就是基于橄榄球: 泰森多边形的概念最好可以去了解一下,可以不用纠结于公式,看看它对一些实际问题的抽象建模表示即可: 分享目的 言简意赅的分享下在团队竞技类问题中一些有用的数据可视化.分析方法,不同的领域下对数据的处理确实千差万别,每

Unity3D RTS游戏中帧同步实现

帧同步技术是早期RTS游戏常用的一种同步技术,本篇文章要给大家介绍的是RTX游戏中帧同步实现,帧同步是一种前后端数据同步的方式,一般应用于对实时性要求很高的网络游戏,想要了解更多帧同步的知识,继续往下看. 一.背景 帧同步技术是早期RTS游戏常用的一种同步技术.与状态同步不同的是,帧同步只同步操作,其大部分游戏逻辑都在客户端上实现,服务器主要负责广播和验证操作,有着逻辑直观易实现.数据量少.可重播等优点. 部分PC游戏如帝国时代.魔兽争霸3.星际争霸等,Host(服务器或某客户端)只当接收到所有

游戏中帧同步的实现

简介 帧同步是一种前后端数据同步的方式,一般应用于对实时性要求很高的网络游戏,常见于dota类和RTS类游戏,如端游中的dota,dota2,梦三国等:手游中的王者荣耀,自由之战等. 过程 帧同步的过程可以简述为: 各客户端实时上传操作指令集; 服务端保存这些操作指令集,并在下一帧将其广播给所有客户端; 客户端收到指令集后分别按帧序执行指令集中的操作. 示例 目前我们正在做的是一款格斗手游,下面是我们项目中使用的同步算法主要伪代码: 1 各客户端实时上传操作指令集 def op_fun(): n

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

本文来自: https://bindog.github.io/blog/2015/03/10/synchronization-in-multiplayer-networked-game-lockstep/#top 值得参考文章:https://blog.codingnow.com/2018/08/lockstep.html 可参考的项目工程:https://github.com/CraneInForest/LockStepSimpleFramework-Shared 0x00 前言 每个人或多或

什么是游戏中的帧同步

游戏中的帧同步是一种客户端与服务器的同步方式,是为了实现高实时性的需求而设计的.在实时pvp游戏中,要求每个客户端高度同步,怎么做到精确的同步呢,那就是向同步的所有客户端广播同步消息.由于网络存在延迟,因此一个客户端发送消息给服务器的过程存在延迟,服务器广播同步消息给其他客户端也存在延迟,为了降低这个延迟,服务器应该尽量减少逻辑,快速地转发消息让客户端能够同步,因此在帧同步中,游戏的逻辑计算应该放到客户端来实现,服务器在收到消息后应该迅速地进行广播,而不应该做过多的逻辑计算.既然是客户端进行计算

手游帧同步的研究

网络游戏的同步可以做的很简单,也可以做的很复杂.简单来说就是通过Http或者Socket来跟服务器同步数据.而如果往复杂了说,可以有p2p.帧同步.航位预测等等高级课题可以研究. 因为我们的项目需求----几百个独立单位的实时同步(带pvp的rts),所以研究了下帧同步.不过后来发现它其实有很多问题,所以具体如何还要看其他同事的研究成果.以我个人来说,修改游戏方案反而是最合理的解决方案. 首先从需求上来说,几百个独立单位的作战,本身结果和士兵强弱从策划的角度来看就是不可控制的.玩家更加不可控制.

两种同步模式:状态同步和帧同步

https://zhuanlan.zhihu.com/p/36884005?utm_medium=social&utm_source=qq 一.同步 所谓同步,就是要多个客户端表现效果是一致的,例如我们玩王者荣耀的时候,需要十个玩家的屏幕显示的英雄位置完全相同.技能释放角度.释放时间完全相同,这个就是同步.就好像很多个人一起跳街舞齐舞,每个人的动作都要保持一致.而对于大多数游戏,不仅客户端的表现要一致,而且需要客户端和服务端的数据是一致的.所以,同步是一个网络游戏概念,只有网络游戏才需要同步,而

状态同步和帧同步个人理解

一.同步 所谓同步,就是要多个客户端表现效果是一致的,例如我们玩王者荣耀的时候,需要十个玩家的屏幕显示的英雄位置完全相同.技能释放角度.释放时间完全相同,这个就是同步.就好像很多个人一起跳街舞齐舞,每个人的动作都要保持一致.而对于大多数游戏,不仅客户端的表现要一致,而且需要客户端和服务端的数据是一致的.所以,同步是一个网络游戏概念,只有网络游戏才需要同步,而单机游戏是不需要同步的. 二.状态同步和帧同步的区别 最大的区别就是战斗核心逻辑写在哪,状态同步的战斗逻辑在服务端,帧同步的战斗逻辑在客户端