帧同步在网上能够搜的资料比较少,关于游戏的更是没有,不过,实现的原理也比较简单,最近几天就写了份关于帧同步的文档,看成给同事扫扫盲,顺便也在这里发发,能够给其余人参考参考算法
--竞技类网络游戏设计方案安全
1、 前言服务器
帧同步,根据wiki百科的定义是,一种对同步源进行像素级同步显示的处理技术,对于网络上的多个接入者,一个信号将会经过主机同步发送给其余人,并同步显示在各个终端上。同步信号能够是每帧的像素数据,也能够是影响数据变化的关键事件信息。网络
帧同步在网络游戏中的应用,设计上有异于传统的mmorpg游戏,由于能够承载更大量的后台计算,实现类单机的效果,因此可应用在相似射击类、飞机类中实现弹幕计算或者格斗类的高精度打击体验架构
本文将主要介绍下帧同步与传统mmorpg设计框架的异同点以及相关的几个设计方案,最后,深刻展开对其中一种实现方案的分析,而相关的反外挂和断线重连机制等技术难点暂不在本文讨论。框架
2、 帧同步在游戏中的应用性能
网络游戏中,游戏服务的架构大体能够分为2种模式,分别是cs模式和p2p模式spa
cs模式框架如图1(c为客户, GSS为游戏状态服务器)设计
图13d
如图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主机与服务器主机协同服务
3、 服务器主机结构设计
服务器主机结构的特色如上所述,这里再深刻展开对该结构的分析与设计。
服务器设计
图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得到逻辑帧通知过来的最新帧,这样,保证了逻辑帧中关键帧进行伤害计算时,渲染帧不会脱帧严重。
4、 反外挂与断线重连
稍等后续文章