游戏帧同步的流程与实现

游戏帧同步的流程与实现,第1张

大纲

现代多人游戏中,多个客户端之间的通讯大多以同步多方状态为主要目标,为了实现这一目标,主要有两个技术方向:

状态同步

状态同步简单来说就是同步游戏中的各种状态,当客户端发送游戏动作到服务器,服务器接收到之后,通过计算游戏行为的结果,然后广播下发给客户端游戏中的各种状态数据。客户端接收到状态数据后显示内容。这种做法类似于各个客户端都在远程操作服务器上的软件。例如最高的mud,以及日后大量的国产网游,特别是回合制游戏,大多采用这种方式。

状态同步的流程:

为了给游戏玩家更好的体验,减少同步的数据量,客户端也会做很多的本地运算,减少服务器同步的频率以及数据量。

状态同步其实是一种不严谨的同步,它的思想中不同玩家屏幕上的一致性的表现并不是重要指标,只要每次操作的结果相同即可。所以状态同步对网络延迟的要求并不高。例如:RPG游戏中200~300ms的延迟对用户来说是可以接受的,但在RTS(即时战略)游戏中50ms的延迟却会很受伤。

帧同步

帧同步是RTS游戏经常采用的一种同步技术,状态同步中数据量会随着需要同步的单位数量增长,而对于RTS来讲动不动就是几百个单位可以被操作,如果这些都需要同步的话,数据量是不能被接受的,所以帧同步不同步状态,之同步操作。例如游戏中同步玩家的操作指令,操作指令包含当前的帧索引。

简单来说,客户端发送游戏动作到服务器,服务器接收并汇总,然后直接转发给所有客户端,或者客户端直接通过P2P技术发送。客户端根据收到的游戏动作来做运算和显示。这种做法等于客户端之间相互远程控制其他客户端上的游戏软件。早期的ipx网络游戏,例如红色警戒、帝国时代、星际争霸,以及大量支持网络连线双打游戏机模拟机,都是采用这种方式。

那些游戏需要使用帧同步呢?

帧同步的流程

帧同步主要依赖客户端的能力,服务器仅仅是做一个转发,甚至客户端可以无需服务器,通过P2P方式来转发数据。由于只是转发游戏的行为,所以广播的数据量比状态同步要小很多。非常适合游戏行为非常频繁的动作游戏,诸如飞行射击、FPS、RTS(即时战略)。

状态同步由于要把整个游戏的状态都广播下去,如果游戏中的对象特别多,比如满屏的子弹、怪物,那么要广播的数据量就会很大,这个时候帧同步的优势就比较明显,因为不管有多少”机器控制的角色“,仅仅需要广播玩家角色有关的操作即可。反过来,如果游戏中有大量玩家同时聚集,那么帧同步和状态同步的差异就不太明显。反而状态同步能得到更多安全性,因为游戏运算在服务器上,比较容易防止外挂。

简单来说,帧同步技术最要的概念是”相同的输入 + 相同的时机 = 相同的显示“。也就是说,游戏接收来自网络的多个客户端的操作,如果这些操作在各个客户端上都是一样的,那么多个客户端的显示也就是一样的,进而带来了”同步“的效果。在这种情况下,各个客户端的运算要绝对一致,不能依赖诸如本地时间、本地随机等”输入“,而要一切以网络来的数据为主。

因为帧同步的特性,因此很容易做出战斗回放,即服务器记录所有操作,客户端请求到操作文件再执行一次。帧同步的特性导致客户端的逻辑实现和表现实现必须完全分离。

帧同步的目的在于消除网络波动性带给玩家的卡顿以及忽快忽慢的不良体验。

状态同步和帧同步的比较和选择

对于单位比较多的即时策略游戏,帧同步是很好的选择。相反的,如果玩家比较多,状态同步则更加合适,因为安全性更高。一般大型MMOARPG都采用状态同步,由于状态同步采用C/S架构,所有状态由服务器来控制,安全性比较高,但流量比较大。帧同步采用的是囚徒模式,所有C端强制采用一个逻辑帧率,从而保证输出一致,其特点是流量小,安全性较差。

囚徒模式又叫锁步模式,就是把所有参与对战的客户端看成排成一列的囚犯,这些囚犯们的左脚都被锁链给连起来,如果要往前走,就只能同时迈步,如果其中某个人走快了或走慢了,都回让整队人停下来。

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

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

什么叫做帧同步呢?服务器收集客户端手机发送过来的操作,然后在特定的时间(收集完成之后),再广播发送给每个客户端。客户端根据接收到的输入,进行同样的逻辑处理,最终得到同样的结果的过程。在实现上,一般都是以服务器按固定的帧率,来搜集每个客户端的输入,然后把这些输入广播给所有客户端。由于每个操作指令到达所有客户端的时间(帧)都是一样的,所以每个客户端运算的结果也是一样的,也就是同样的输入就会得到同样的结果。

这就好像是玩家通过网络将操作手柄连接到你的手机,这种同步方案是传统单机局域网游戏中最常见的。

帧同步模型最大的优点在于强一致性,每个客户端的表现是完全一样的,非常适合高度要求操作技巧的游戏。由于广播的仅仅是玩家的操作,所以数据量很少。不管游戏中的角色数量、状态数量有多大多复杂,都不会影响广播的数据量。

帧同步模型最大的缺点是对所有玩家的延迟都有要求,一般来说要求在50毫秒以内,如果有一个客户端网络卡住了,所有客户端都要停下来等待。

另外在帧同步模式中,数据同步的频率较高,网络延迟越小越好。由于TCP的滑动窗口机制和重传机制,导致延时机制,导致延时无法控制。因此帧同步一般采用UDP进行网络传输,但UDP又会衍生出可靠性问题,对于客户端,如果某些UDP包没有收到,就会出现丢帧的情况。

客户端A的操作A1与客户端B的操作B1,共同封装成OperateCmd数据发送给PVP服务器,PVP服务器每66毫秒产生一个逻辑祯,在该桢所在时间段内,收到A1和B1后,生成一个Frame数据块,在该帧时间结束时,将Frame发送给客户端A和B。Frame数据块内有该帧的帧号,客户端A和B接收到Frame数据后,便知道该帧内,客户端A和客户端B都做了什么操作。然后根据接收到的消息A1和B1进行游戏表现,最终呈现给玩家A和B的结果是一致性的,从而实现客户端A和B的数据同步。

帧同步既然是在特定时间发送,也就是说每隔一段时间收集用户操作指令,那么要间隔多久内。例如每隔一段时间搜索用户的操作。此时,如果时间太快则网络速率达不到要求,如果时间太长则用户操作不流程。哪里多少才比较合适呢?根据统计玩家至少要在50ms 100ms可以完成一次,一般维持到15 20次左右会比较安全。

震惊!某 游戏 奖金上亿赛事观战竟卡成PPT,周六无法开启 游戏 ,玩家们竟这样说?

适应了!

不得不以一个UC式的开头来吐槽笔者上周末的遭遇,笔者与久未相见的朋友兴冲冲地准备开个两人黑,但朋友受不了反复出现的老问题,扭头玩起了更老的 游戏 DNF。

作为一名经验丰富且久经考验的dota2战士,我熟知各类紧急抢救操作,随意试玩机器人模式可以解决这个老问题,可我朋友只是个周末玩家而已。

为什么我的眼里常含泪水,只因为我对这服务器恨得深沉,当我死了,我一定要带走这垃圾服务器。爱从来不需要理由,就像诗人艾青对祖国深沉的爱一样与生俱来。但恨却比爱显得更加感情激烈,可以有没来由的爱,却从来没有无来由的恨。

我真的无奈于这服务器,无法直面这惨淡的周末时光。

一 CALL ME DAD

为什么服务器是爸爸,对,说的就是你,Dota2的服务器。

The Server is the Man!

其实,早在上世界九十年代,国外的 游戏 爱好者便开始搭建服务器提供收费 游戏 服务,是最早的 游戏 开发商,运行商和获利者。

但对早年的国内大部分 游戏 玩家而言,服务器或者说另类的主机是一个较为虚幻的概念,大部分的 游戏 只能称之为联网 游戏 ,或者干脆就是简单的联机 游戏 ,真正让大家对于服务器拥有概念的是大型网络 游戏 ”(MMOG)的浮出水面,使得 游戏 直接联入互联网,激发了大家强烈的互动情绪。

诸多即时战略 游戏 的出现更是加深了这一认知。

我想要和别人一起玩,

这成为玩家心中的呼声。

正是在这股思潮的鼓动之下,使得多人在线 游戏 成为了大家心中的宠儿,自然包括我们的dota。在2005年,6.01版发布不久, IceFrog成为dota主要的地图程序员,负责包括 游戏 的执行和平衡的测试在内的任何工作。

在2003年《魔兽争霸III:冰封王座》之后,暴雪公司正式宣布了《魔兽世界》的开发计划,之前就已经秘密开发了数年之久。魔兽世界于2004年年中在北美公开测试,2004年11月开始在美国发行,中国大陆亦已于2005年6月正式收费运营。

服务器这一概念才开始深入人心,普通玩家才开始走进服务器。

服务器正是为了解决大型多人在线 游戏 产生的诸多问题而生,而延迟,或者说网络同步正是它要解决的问题之一。

在虚拟世界中,保证 游戏 的一致性是一个基本前提。通俗的说就是虚拟世界中的事实,当多人玩家一起玩 游戏 时,看上去他们确实像是在共享同一个虚拟世界,在同一个世界中游玩。比如在一个FPS 游戏 中,大家的延迟都很高,A、B两个玩家同时发现了对方,并向对方射击,如果没有很好的同步机制,那么A的屏幕上显示B还没有开枪就被击杀,而B的屏幕上显示A还没有开枪就被击杀,这就出现了不一致的问提。

OK,这让我们回到开头,让我们来了解为什么dota2的服务器是玩家们的爸爸,而在dota1中我们却很少遇到卡顿情况,反而碰到的大多是挂比们。

原因是两者采取的处理延迟的方式不一样而已,他们采用了不同的 游戏 同步模式。一个是帧同步,另一个是状态同步。当然实际应用下来很复杂,这里只是简单介绍而已。

其实在早期的DOTA或者说WAR3中,严格意义上是没有服务器这一概念的,类似的只有主机这一说法,但主机并不满足服务器这一严格定义。在这里感谢来源于网上的图片与相关资料,只做引用,以向大众简单介绍为主。

什么是帧同步?

一般War3/星际等采用,基于指令驱动各个客户端自计算逻辑。服务端只管分发指令,每个客户端根据完整的规则运算整个战场。

简单来说,就是所有的事自己管,所有的数据都有自己的数据完成,网络传输的仅仅是指令而已,既是玩家的操作指令,由自己的电脑完成计算并呈现出来,具体下来。其实你只是在看一场由自己计算机演算好的视频而已。

这样对网的要求仅仅只是稳定而已,它并不需要巨大的流量,你的电脑将会自己计算完成一切,自然作弊也很简单,数据处理几乎由你自己完成,哪里不能作弊开挂呢?

那什么是状态同步?

大部分MMORPG的主要实现方式,具体下来,服务器负责计算大部分的 游戏 过程,并且转送这些计算的结果,客户端仅仅负责发送玩家的操作,以及表现收到的 游戏 结果。服务器是一个运行 游戏 的专用主机,用于裁定世界模拟, 游戏 规则,玩家输入处理。客户端是一个连接到 游戏 服务器的计算机。客户端和服务器之间,通过相互以高频率发送小数据包来交互。客户端从服务器接收到世界的当前状态,并且根据这些状态更新,生成输出视频、音频内容,进而呈现在玩家面前。

简单来说,对于我们的电脑而言,上面的dota2客户端虽然也承担 游戏 逻辑的模拟,只处理些不太重要的逻辑计算。因此更像是素材收集库,大号的电视机,显示器。我们只知道我们自己的事,其他的东西全在服务器身上。

1 网络完善状态好,不仅要稳定还要快速

因为服务器和客户端需要进行所有的数据交互和同步,导致网络流量大。所以涉及到的网络问题一旦发生波动,不管是哪一方,影响都特别巨大。

2 服务器压力大,卡顿时直接闪现

前文中已经提到,服务器负责处理大部分的 游戏 逻辑计算,因此,大部分的 游戏 处理过程都是由服务器完成,再将数据传送回客户端呈现,因此服务器出了一点问题,直接导致我们的体验很差,直接GG。

3 地狱火问题,单位数量越多越卡

这只是一个小问题,笔者早年曾经遇到过,单位越多同步的数据量越大,当单位越多时,往往会越卡,本来尚能接受的 游戏 流畅程度瞬间下滑。早年服务器脆弱时,几乎很清楚可以看见这个问题,几个地狱火一砸,卡顿明显,现在基本已经消失。

正是如此导致网络延迟处理起来特别的麻烦,即使是专业人员也得花时间来排除,然而这并不能成为理由。

二 完美和V社的糊涂账

完美的支持者说,明明先登国外协调服务器,红字完美可不背锅,再说了,国际服有时不也登不上嘛,国际间网络影响啦。

V社的支持者说,国服可比外服崩的常见多了,再说了,每周六的必卡,不定期卡顿,这个锅也能放到V社身上?

争吵无益于解决任何问题。

结果一团乱麻,受伤的只有想玩 游戏 的我们。

作为拥有这个星球最高 游戏 奖金赛事的dota2,实在不应该如此没有牌面,很显然的一点,当年这款用户成熟度极高,赛事层出不穷的顶级 游戏 产品,始终没有迎来如同当年一样灿烂的未来。

很难想象,这是一款几乎与英雄联盟同时推出的 游戏 ,作为继任者的dota2,最正版毫无争议的完成品,但是在用户的数量上,从一开始DOTA与《英雄联盟》在用户上的并驾齐驱,到了后来《英雄联盟》完完全全的甩开了“继承者”的DOTA2。

从 游戏 人数上来说,dota2并没有完成它转化老玩家和吸引新玩家的 历史 使命,在这两项大考上都交出了不及格的答卷,建立于辉煌之上却最终只能偏距一隅。笔者很幸运也是2012就能接触玩到dota2,但一直一来体验真的糟糕,多少次满怀期待却因为服务器最终无奈GG,最终在13年ti3结束才最终得以享受流畅的 游戏 ,真的是一把辛酸泪。

V社和完美可以称得上是天生的合作者,各怀心思,却又不谋而合。

完美试图通过对dota2的支持完成自身电竞版图的构成,在电竞这一未来大势面前发出自己的声音,真正的盈利对完美来说并不重要,从财报来看,坚挺的老端游和全新的手游,甚至不断发展的影视事业这些才是完美的经济增长点。

其次,对于V社手中的steam,完美同样抱有期待,作为最想代理的产品,代理steam可不再是赔钱赚吆喝那么简单了。

但完美到底愿意花多少心思在dota2上,我们不得而知,毕竟,办事和努力办事就在努力两字上了。

但从V社角度来看,没有比完美更好的背锅侠和小弟了,steam通过曲线救国的方式走进了玩家心中。

完美代理了DOTA2,但是所有用户是通过Steam下载,只是一开始使用一下完美的账号,后面完全是通过Steam账号,所有的用户数据基本都在V社手里,发生了什么也只能求靠远在大洋彼岸的V社工程师。当初V社选择制作dota2也是想到了借助其广大的用户基数推广steam平台,在中国它成功了,而且是相当的成功,普通玩家通过这个平台了解到了更多的 游戏 。

双方的目的都达到了,那么到底谁该为土豆服务器买单呢?

steam素来以服务器质量过硬而享誉盛名,可为什么在dota2的服务器上偏偏和育碧一样呢?完美在业内同样拥有声誉,技术实力同样不容小觑,开发的 游戏 也是一个赛一个的精致,可为啥连相当成熟的服务器技术方案都解决和实施不好呢?

完美真的甘愿顶着骂名,而V社也继续选择合作,甚至在CSGO之后将steam中国也交给了他们,显然对完美信任有加。

三 无奈的玩家

玩家有多喜爱这个 游戏 ,就有多讨厌这个不时抽风的服务器。

这个顽疾几乎是伴随着dota2而生,几乎是每一个玩家的切身之痛,它就好像是一个dota2上无可奈何的瘤子,吸着玩家们宝贵的时间,吸着玩家们最珍贵的耐心,消磨着玩家们不断积攒下来的最真挚对dota2的热爱。

年年高涨的奖金证明了玩家们的爱,笔者从有余力开始就没有断过支持,因为玩饰品真的上瘾,没够。即使是笔者的不少云玩家朋友也依然贡献了不少,年年不曾缺席的他们依然会看着直播,不忙的时候来把dota。可有时这糟糕的观战也让人感到难受。

观战问题真的延续有很长一阵时间了,眼看本土TI将至,中国地区的预选赛也即将开打,那什么来宽慰一直在支持的玩家们呢?

答应我,起码观战不要PPT,好吗?

这真的是一个简单的要求。

状态同步简单来说就是有一个权威服务器运行着一个没有图形界面的客户端,然后服务器收集所有人的操作数据 计算后再把所有人的关键数据广播给所有人,玩家的客户端只是服务器的一个展示。 缺点是有些情况下同步数据量会很大 因为计算全在服务器所以可能压力会比较大。 帧同步中的每一个客户端都是要计算所有数据,服务器只需要转发彼此的操作即可。 帧同步的同步过程: 1.收集所有人的输入,广播给所有人。 2.客户端接收到所有人的输入,客户端本地开始根据输入计算得到游戏结果。 优点 服务器压力小,同步的数据量也很小相对应的可以有更低的延迟和带宽占用,可以直接没有服务器。天生支持录像。 缺点 反作弊难度较大,所有数据都在客户端本地。 如果要做帧同步 就必须保证所有客户端再执行相同操作的情况下的结果必须百分百一样,这样我们就不可以使用Unity自带的物理引擎。(亲测 会不同步) 因为不同cpu和操作系统可能float的精度也不同 所以也要避免使用float。(虽然说float有固定标准的,按理来说现在不同平台已经都一样了,但是谨慎起见我还是没用float) 帧同步的核心逻辑也不可以写在Unity脚本的生命周期里 例如Update 首先要区分 逻辑帧和渲染帧。 我们同步的是逻辑帧,所有位移和伤害判定什么的也都是在逻辑帧中,渲染帧中做平滑处理。 Unity中的帧就可以当作是渲染帧。 每次Update就是一个渲染帧,每次FixedUpdate就可以当作是逻辑帧。 渲染帧是没有固定间隔的 性能高刷的就快间隔就短。而逻辑帧是必须固定间隔的。 我两台手机要创建房间进行游戏。 服务器接收Input数据 服务器广播Input消息 上面的例子中 服务器的那台机器 如果渲染帧卡了一秒 而逻辑帧1秒20帧 ,那么就直接一个渲染帧中调用20次逻辑帧 追赶上进度。 如果服务器卡住了 所有人也都会同步暂停。 如果你有需要 也可以做主机迁移 随时接替原来的主机 防止房主掉线 大家一起掉线。 无论帧同步还是状态同步理论上来说都要做预测回滚,状态同步做这个还好做一点。 预测回滚基本就是按照上一次的操作客户端自动多模拟一帧或者几帧 来抵消网络延迟的感觉,但是如果预测结果和之后真实发生的结果不符的时候 就需要回滚客户端到正常的结果上 然后再次预测。 (如果一个人在游戏里 反复左右移动 比如CS里对枪时 疯狂ADADADADAD左右移动 这种情况下 如果有客户端有预测回滚 就会疯狂的预测错误而回滚 客户端也会增加额外的计算压力) 预测回滚因为我自己做的效果很不好 大概如下图一样,所以我就不讲具体怎么做了。 (英雄联盟的预测回滚做的也不咋样,设置里面有个预测选项默认是关闭的 手动勾选打开之后 就算网络正常效果也跟下图一样。) 预测回滚的方案很多 并不是只有一种,像《战地3》的预测回滚就特别魔性 你如果击中敌人了 但是因为延迟导致服务器判定没击中,但是你客户端已经提示击中了 再对其他人影响不大的情况下 它会让其他所有玩家和服务器陪着他一块回滚 让子弹打中那个人。。。。 (难道这就是我快速躲进掩体里之后还被打死的原因?)。 玩家每一逻辑帧执行结束之后 把所有角色的关键数据加密为MD5 上传服务器,服务器进行比对。如果是所有人上传上来的MD5都一样 说明所有人的游戏结果都是同步的,如果有人修改了血量那么就会造成游戏不同步 自己的MD5和其他人的不一样,服务器可以强行纠正它 或者 踢掉它。 游戏结束之后上传整场比赛左右的操作数据,服务器开一个客户端 一瞬间跑完所有操作所有帧 看最终的结果与客户端上报上来结果是否一致,如果不一致肯定有人作弊了。 像透视 自瞄这种 本质上没有改变游戏数据的作弊 就不太容易检测。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/578398.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-07-05
下一篇2023-07-05

发表评论

登录后才能评论

评论列表(0条)

    保存