精华内容
下载资源
问答
  • Untiy 帧同步的探索之路一 位置帧同步
    热门讨论
    2021-05-22 17:33:14

    帧同步技术是早期RTS游戏常用的一种同步技术。与状态同步不同的是,帧同步只同步操作,其大部分游戏逻辑都在客户端上实现,服务器主要负责广播和验证操作,有着逻辑直观易实现、数据量少、可重播等优点。

    帧同步与状态同步相比各有各的优点。

    不管我们当前用不用的到某些技术,但说不定我们以后会用到,所以多一份技术傍身,一方面是为了壮大自身,能找到更好的工作。一方面是多一份技术,就多一份自信,多一份能力。

    本篇文章是帧同步系列文章研究学习之路的一个记录之一。

    在这里插入图片描述

    环境

    客户端环境:Unity2018

    服务端环境:PhotonServer

    使用到的技术

    • 帧同步
    • 锁帧
    • UDP
    • 定点数学库
    • 强制同步帧

    未使用技术

    • 随机种子
    • 帧同步物理系统
    • 预测
    • 回滚
    • 回放
    • 防作弊
    • 断线重连处理
    • 等等等等

    帧同步核心

    • 相同时机+相同输入
    • 渲染与表现分离
    • 避免精度损失

    遇到的问题:

    1.亲测Untiy的物理系统不靠谱,会产生不同步,尽量避免使用Unity的物理系统,摇杆移动角色最好自己使用定点数加以控制保证其位置绝对性。

    2.客户端在必要时需要进行锁帧,保证所有客户端帧数的一致性,否则会造成延迟。

    锁帧

    为什么会有锁帧这个概念,主要原因是为了达到所以客户端的帧数一致性。
    为什么会出现帧数不一致性?
    主要还是因为网络问题导致所以客户端无法准确的在同一时间收到服务端下达的游戏开始或者逻辑帧开始的命令,不同的网络环境下每个客户端收到的消息的时间有很大的不确定性,如果不进行锁帧,比入在游戏刚开始的时候,服务端下发了一条逻辑帧开始的命令,有的客户端网络好收到的比较早,有的客户端比较慢,收到的比较迟,这就会导致,先收到命令的那个客户端的逻辑帧已经跑到了5帧左右,而后收到的客户端逻辑帧才开始跑。这种帧数不同步的情况就已经是一个错误。会造成逻辑优先的那个客户端有很大的延迟,因为每个客户端的同步帧是服务器一次性下发的,而帧优先的客户端,在第5帧做了一些事件,这个时候服务器不会立即回复第五帧的消息,因为服务器会等待所有的客户端的帧事件到达之后,才会进行同步帧的发送。而由于另一个客户端的逻辑帧比较慢,就导致服务器被迫跟着慢逻辑帧的客户端进行同步,而你走的快,发送的帧自然要等待另一个慢的客户端走到这一帧了才会收到自己的帧事件,所以就造成了延迟。(这里初步暂时使用的为等待式同步,并不是自动填充空帧式同步,目的式为了踏出第一步)

    在刚进入游戏时,进行锁帧,等待与其他所有客户端的帧id同步时,在进行帧同步逻辑。

    帧同步

    相同的时机+相同的输入=相同的输出=帧同步的核心基础

    UDP

    因为帧同步的数据量比较频繁,且对延迟要求比较低,鉴于UDP传输速度比较快,所有可靠的UDP传输是非常好的选择,因为UDP相较于TCP能把延迟给我们降到最低。

    同步方式

    这里初步暂时使用的为等待式同步,并不是填充同步,目的是为了确定帧同步方案可行性。

    等待式同步:
    服务器每隔固定时间进行一次同步,但同步的时候会端等待所有的客户端当前帧的数据到达之后,进行同步。

    填充式同步:

    服务器每隔固定的时间进行一次同步,如果到达了同步点有某个客户端没有发来帧数据,直接填充空帧,不进行等待,然后进行同步。

    定点数数学库

    使用定点数学库的目的就是为了避免浮点型在不同平台带来的误差,由于不同平台的硬件等环境不一致,在相同的数据情况下,不可能保证得出的小数点结果完全一致。哪怕是有一点偏差,次数上来了,偏差也就大了。因此,必须使用定点数学库,来确定不同平台以及不同客户端的结果的一致性。

    努力积才能,壹叶便成名。

    喜欢我关注我,更多干货等着你!

    更多相关内容
  • 网络游戏开发项目中帧同步,状态同步如何选? 网络游戏的核心技术之一就是玩家的网络同步,主流的网络同步有”帧同步”与”状态同步”。今天我们来分析一下这两种同步模式。同时教大家如何在自己的项目中采用最合适的...

    网络游戏开发项目中帧同步,状态同步如何选?

    网络游戏的核心技术之一就是玩家的网络同步,主流的网络同步有”帧同步”与”状态同步”。今天我们来分析一下这两种同步模式。同时教大家如何在自己的项目中采用最合适的同步方式。接下来从以下3个方面来阐述:

    1: 状态同步的原理与常用的处理方式;

    2: 帧同步的原理与常用的处理方式;

    3: 哪些游戏适合帧同步,哪些游戏适合状态同步;

    这里有个学习交流小组 里面有大佬 有萌新 大家可以一起学习交流哦

    希望能帮助大家掌握帧同步与状态同步原理,并能做出对项目与团队最正确的选择。

    状态同步的原理与常用的处理方式

    状态同步是在服务器上跑完整的游戏逻辑,包含每个角色在游戏地图上行走,攻击。角色与角色的战斗,都要编写代码实现在服务端。可以理解为是跑在服务端的没有图像渲染的游戏。同时由于多人在线,服务器端接收每个玩家的客户端传过来的输入操作,根据玩家操作来迭代计算游戏。一般采用状态同步的网络游戏,在服务器上实现战斗逻辑,寻路导航,地图, 技能释放, 怪物AI行为决策, 物理引擎等常见的游戏开发的功能与模块(具体是哪些模块需要根据不同的项目来决定)。

    每个玩家+NPC+怪物都在服务器上有对应的数据对象,并且这么多对象都要处理,而且这些对象为避免线程锁等开销,一般都在一个线程, 所以像MMORPG 每个地图的同时在线的游戏人数是有上限的,上限取决于服务器的机器配置与游戏逻辑的复杂度。比如魔兽世界”一个地图”最多同时在线约3000人左右。有人就会问魔兽世界每天同时在线的人数远远超过3000人,怎么你说它一个地图最多是3000人”同时在线”呢?这里的”同时在线”指的是同一个地图的两个玩家,走到同一个地方,彼此能看到对方。而不是两个玩家同时在玩同一个地图名字,但是走到地图的同一个位置彼此看不见 (相当于两个不同的逻辑服,用的是同一个地图)。到目前为止你可以想像成状态同步的服务器是一个跑有若干玩家的游戏逻辑,这些玩家的操作输入指令来自于网络客户端。

    游戏玩家是要看图像的,不能只看数据在那里跑, 客户端就要根据服务器上的”状态”重现出服务器上当前的游戏画面。如果客户端把服务器上所有的玩家角色都创建并渲染出来, 客户端性能可能达不到,也没有必要,每个玩家都有一个特定的”视野” 范围, 视野内的游戏角色的画面在客户端构建同步出来就可以了,视野外的可以不用管。所以客户端是同步视野范围内服务器的状态的画面。

    大家都是根据服务器上的状态来显示画面的,所以不同客户端能”同步”。准确的讲是同步显示的服务器上元素状态。什么是”状态”?一般游戏里面我们把一些关键的信息叫做”状态”, 举一个例子:

       角色怪物出生
       角色怪物的Idle, Walk, Attack, Dead等

    接下来我们拿玩家从创建对象, 到待机,到行走,到攻击,回到待机来举例,来看下角色的状态变化以及这个过程中客户端如何同步。

    服务器上创建了一个角色对象A,这个角色对象A就会出现在”若干玩家”的视野里(AOI算法),对于这若干玩家而言状态发生了变化,服务器给它们都发送一个角色创建的状态信息含角色的位置,角色的类型,朝向角度,角色状态(Idle)等,这些玩家客户端就把这些角色创建出来。对于角色对象A对应的客户端,服务器要把它视野范围内(AOI)的其它客户端的角色状态发送给它,然后它根据这些状态信息把画面绘制出来。接下来服务器就按照角色状态进行迭代,待机的待机,行走的行走。客户端按照状态也进行迭代,一但状态变化就同步,我们接着角色对象A创建出来的idle状态来分析,那么服务器上角色对象A是Idle其它玩家看它也是Idle。角色对象A发了一个行走的操作给服务器,服务器先判断这个操作的合法性,如果合法,服务器就把角色对象A的状态(位置,旋转,状态等关键指标)+玩家的行走操作(寻路走到目的地dst)一起发送给能看见A玩家的人(能看见A的客户端+包含A自己),关键来了,收到这个状态变化后,每个客户端先重置一下角色数据的状态(位置,旋转,缩放)与服务器同步,在大家都同步到服务器的状态的基础上再做寻路移动操作。接下来角色对象A开始行走了,服务器上要寻路,然后迭代A的行走数据,客户端上的对象A也要寻路,也要再客户端上行走,这个过程可以和服务器失去联系(服务器走服务器的,客户端走客户的端的)。这样角色A就在客户端走起来。行走过程中客户端A发现了一个怪物,点了一下怪物,触发攻击操作,这个时候服务端收到这个客户端A的攻击操作,先判断检查是否合法,如果合法了角色A就要从Walk状态到Attack状态了,这个时候服务端先把服务器上角色A目前的状态(位置,旋转,缩放等)+服务器上角色A的操作一起发给对可见角色A的客户端+角色A自己。收到这个数据后,先同步状态(重置客户端上的角色状态到为服务器上的状态),然后基于同步服务端状态后的再做攻击操作,客户端播放攻击动画,服务端计算攻击逻辑和伤害。当服务器迭代的过程中发现了怪物已经被打死了(状态变化),那么就把角色A的状态+怪物状态,同步给对角色A感兴趣的客户端,然后同步怪物与角色A的状态,然后客户端就把角色A由攻击变成idle状态了,位置也同步了服务器上的。

    总结一下,客户端根据服务器的状态+后续操作来重现游戏画面,服务器接收玩家操作,独立迭代游戏逻辑,迭代中发现状态变化(玩家操作等决策引起),通知客户端,客户端先同步服务器上的状态,然后基于这个状态再结合操作播放动画。总之服务端迭代服务端的,客户端迭代客户端的,服务器每次状态变化,同步到客户端后再接着播放动画。客户端与服务器上同步的是服务器上的最后的一个状态。

    帧同步的原理与常用的处理方式

    做单机游戏时,根据客户端的帧率来驱动我们的游戏逻辑,每帧检查玩家有没有操作,如果有操作就进行处理。单机游戏的本质就是基于帧率来进行驱动的。帧同步原理就是把这个帧率在本机的转为由服务器每隔一段时间向客户端发送数据来作为帧来驱动游戏, 同样的服务器的驱动,同样的客户端逻辑代码,每个客户端跑出来的结果就是一致的。

    服务端只要负责把每帧采集到的玩家操作,转给所有客户端, 这样客户端根据服务端的帧操作来迭代游戏。客户端的帧率是60左右给玩家的感觉是比较流畅的,服务器以多少的帧率来驱动客户端玩家感觉会是流畅的呢?60FPS是画面的流畅度,服务器同步的是操作,人的反应时间是50~100ms,所以服务器只需要20FPS左右就能够获得非常流畅的操作手感,所以帧同步服务器的帧率一般是每秒15~20FPS左右。

    了解帧以后,接下来看如何基于帧同步, 服务器如果确认了每秒20FPS,那么服务器帧的时间间隔就确定了为50ms, 当我们收到一个新的服务器帧的时候,先不着急处理,而是先要回到上一帧的状态(位置,旋转等),然后基于上一帧的操作来使用50ms时间间隔来迭代这帧的结果,再基于当前同步后的状态处理服务器给我们发过来的帧操作,播放动画等。所以帧同步是每帧都同步。客户端根据当前帧来展现动画,到下一帧来的时候先做同步计算,这样达到客户端同步,这里的同步准确的说是每一个服务器帧都进行同步, 这一帧能同步是基于上一帧同步的基础上同样的操作+同样的时间间隔迭代出来的同步。和状态同步不同,状态同步的状态全部记录在服务端了,而帧同步是需要依赖前一帧,前一帧又依赖前前帧,这样直到第1帧。所以帧同步每次断线重连,时间久就是这个道理,因为要重新新从第一帧开始算起。

    哪些游戏适合帧同步,哪些游戏适合状态同步

    搞懂了上面的原理,我们来看下哪些游戏适合帧同步,哪些游戏适合状态同步。状态同步基本上适合绝大部分的游戏,包括帧同步擅长的领域用状态同步做也能做的很好。帧同步的局限性就大很多了,接下来我们来分析帧同步的优点与缺点。帧同步与状态同步相比,服务器要简单很多,而且服务器的项目可以高度重用,因为写好一个游戏的服务端帧同步,下一个游戏的服务器基本不用改,所以腾讯推出一些服务端的集成方案就有帧同步的服务器,每个游戏项目都可以用, 做到服务端高度重用。帧同步与状态同步相比,帧同步更平滑,不会有一些峰值,这样导致玩家的手感一直很好,什么叫做峰值,状态同步,突然某个时刻状态变化比较多,同步的数据量大,网络和处理可能会有瞬间的卡顿,而这种可能就影响关键时候的手感,帧同步在这块就更平滑。每次只要同步玩家的操作,数据包更小。所以一些强调操作手感的游戏是可以用帧同步来做的。帧同步每一个玩家对应的角色都要在客户端计算迭代,而不像状态同步只迭代视野范围内的,所以帧同步对客户端的运算量会变大,同时帧同步不能适用在同时3000人一起玩的游戏,因为3000个角色都要在客户端,每帧都同时迭代计算,客户端性能达不到。所有MMORPG, 这种游戏基本都不采用帧同步,采用帧同步的都是固定一起对战的人数的,如王者荣耀5v5, 守望先锋等。帧同步每次同步都是当前帧依赖前一帧,每次断线重连,只能从第1帧开始迭代计算,快速的跳到最新的帧,所以采用帧同步的游戏一局的时间不能太长,比如一局游戏可以打2天,你每帧都要保存住,如果某个玩家断线从连,要从2天前的帧开始计算,这个就只能呵呵了,MMORPG 这种游戏不适合帧同步。帧同步的计算全部放客户端,所以没有状态同步那么安全。

    分析完后我们得到一条结论: 一局时间不长的游戏,每一局不允许玩家中途进来的游戏,每一局的人数是少量固定的(5vs5, 10vs10),对客户端计算不敏感,这种游戏可以采用帧同步。帧同步能获得很好的操作手感,降低服务端的开发难度,如果没有服务端的团队,还可以用腾讯的帧同步服务器。

    今天的分析就到这里了,主页有一个小组,里面有萌新,有大佬 还有一个比较好的游戏教程分享,详细的讲解了帧同步的20个流程详解与状态同步的实战解密等。

    展开全文
  • 帧同步的基本原理 帧事件数据采集 帧同步的事件处理与动画 帧同步的逻辑数据同步 帧同步之跳帧处理 现代多人游戏中,多个客户端之间的通讯大多以同步多方状态为主要目标,为了实现这一目标,主要有两个技术方向...

    文章转载自:https://www.jianshu.com/p/8cca5458c45b

    大纲

    • 帧同步的基本原理
    • 帧事件数据采集
    • 帧同步的事件处理与动画
    • 帧同步的逻辑数据同步
    • 帧同步之跳帧处理

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

    • 状态同步
    • 帧同步

     

    状态同步

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

    状态同步的流程:

    1. 客户端上传操作到服务器
    2. 服务器收到后计算游戏行为的结果(如技能逻辑、战斗计算等)
    3. 服务器以广播的方式下发游戏中各种状态
    4. 客户端收到状态后更新本地状态(如动作状态、Buff状态、位置等)

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

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

     

    帧同步

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

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

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

    • 多人实时对战游戏
    • 游戏中需要战斗回放功能
    • 游戏中需要加速功能
    • 需要服务器同步逻辑校验防止作弊

     

    帧同步的流程

    1. 同步随机种子:游戏中设计随机数的使用,通过同步随机数种子可以保持随机数的一致性。
    2. 客户端上传操作指令给服务器,操作指令包含游戏操作和当前帧索引。
    3. 游戏广播所有客户端的操作,如果没有操作也要广播空指令来驱动游戏帧前进。

    帧同步主要依赖客户端的能力,服务器仅仅是做一个转发,甚至客户端可以无需服务器,通过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次左右会比较安全。

    展开全文
  • 帧同步进阶

    2020-08-25 17:58:31
    帧同步储备知识点 网络协议:TCP或者UDP,一般是采用可靠的UDP。 ProtoBuf:谷歌制定的一种数据传输与存储格式: 随机数种子:游戏中难免会出现一些产生随机数的场景,但是如果是帧同步的话,就要保证各个客户端...

    帧同步储备知识点

    在这里插入图片描述
    网络协议:TCP或者UDP,一般是采用可靠的UDP。
    ProtoBuf:谷歌制定的一种数据传输与存储格式:
    随机数种子:游戏中难免会出现一些产生随机数的场景,但是如果是帧同步的话,就要保证各个客户端生成的随机数是一致的,否则就会出现数据不同的情况。但是要实现这样一个生成随机数的需求,就需要使用随机数种子,而这实际上并不算是真正的随机。
    帧:帧可以是通常意义上的一个帧,也就是一个图片里的信息,也可以表达是一个短暂的时间片。在帧同步机制中,玩家并不是操作一次就上传一次操作,而是积攒一个事件片的操作打包发给服务器,然后服务器返回,客户端表现。

    为什么使用UDP做帧同步

    1,帧同步传输频率高,需要保证传输速度
    2,两种“长连接”传输协议比较
    在这里插入图片描述
    UDP实际上是无连接的,而TCP是面向连接的。客户端使用UDP技术像服务器端发送消息,只需要知道地址和IP端口。
    登陆游戏、匹配游戏、寻找房间可以用TCP来做,在战场同步中使用UDP。

    帧同步同步什么?

    同步的是玩家操作:(至少包含如下两块内容)
    1,帧序列:产生的每一帧都要加一个序号,客户端产生一帧,服务器记录一帧、然后返回、客户端播放一帧。目的就是让服务器知道目前所有的客户端,假如一个房间有10个人,这10个人的客户端都像服务器上传了第1帧,这个游戏才可以被开始,并且一帧都不能漏,因为客户端是严格按照帧来驱动的。

    2,玩家操作信息:
    (1)battleID 战场号、房间号 : 服务器端实际上是维护着很多房间的,因此必须要区分战场号、房间号,这样服务器才能正确的转发给正确的玩家。
    (2)move 玩家摇杆方向 :玩家的操作,点击了哪些,往哪个方向走的。
    如果没有操作是否也要上传帧呢?当然是要的,因为帧同步要求每一帧。
    例如带战斗回放功能的游戏,例如我玩过的魔兽争霸,星际争霸,客户端保存了每一帧当中所有玩家的操作,这样客户端就可以通过推演来重现这个对战的过程,如果没有操作,也要上传一个空的操作帧。

    帧频率

    收集一帧操作的时间片。客户端在一个时间结尾收集玩家的操作发给服务端。
    所以帧频率不能太大,因为只发最后一个操作,玩家虽然在移动摇杆,但是人物没有马上跟着动,并不是收集所有操作放到一个数组里,然后一起发过去。因此玩家的操作没有准确的映射到游戏中,就会造成游戏体验很差。
    帧频率也不能太小,因为这样就没有多余的帧去做解析处理,网络同步下来必然比客户端要慢。

    因此要保证帧频率在一个合适的频率。如果是一个低配手机,它的帧率必须要达到网络同步所需的帧频率,如果配置过低,那么就需要降低材质,降低其他方面的性能去提升帧率,这样才可以继续游戏。

    帧同步当中TCP的使用

    在这里插入图片描述
    进入战场之后使用UDP来同步,而进入战场之前可以使用TCP来完成玩家登陆、玩家匹配、开始对局的功能。
    具体过程:
    1,启动服务器,启动TCP监听线程
    2,客户端点击登陆,请求建立TCP连接
    3,服务器返回一个成功,就连接成功了
    4,客户端创建一个监听线程,与服务器互相监听,建立一个长连接
    5,客户端发送登陆请求
    在这里插入图片描述
    6,ServerTcp通过调用UserLogin在UserManage(用户管理模块)中记录玩家当前的信息
    7,记录玩家信息
    8,返回成功
    9,首次使用(第一个登陆进来的玩家)生成UdpManager单例(懒加载),后面的玩家没有这个步骤
    **懒加载:**单例模式,引用一个单例时,判断当前的单例存不存在,如果存在就返回,如果不存在就new一个返回。
    10,ServerTcp向客户端发送Login相应消息
    在这里插入图片描述
    11,进入匹配场景
    12,客户端发送匹配消息到服务器
    13,ServerTcp告诉MatchManager(匹配模块)加入了一个匹配玩家
    14,MatchManager判断房间人数是否足够(实际应用中很复杂,要匹配玩家的等级,战斗力,开黑)
    15,如果房间人数足够,则进入16
    在这里插入图片描述
    16,通知BattleManager(战斗模块)开始对局准备(创建战场,给每个玩家创建Udp消息)
    17,创建一个BattleCon,调用CreateBattle方法。
    18,CreateBattle创建战场,确定随机数种子,为每个客户端创建Udp
    19,向客户端发送准备消息
    20,根据返回的消息更新客户端消息数据。切换场景,进入战场场景,创建角色预制体,生成场景

    展开全文
  • 帧同步 1. 状态同步 状态同步简单来说就是同步游戏中的各种状态,当客户端发送游戏动作到服务器,服务器接收到之后,通过计算游戏行为的结果,然后广播下发给客户端游戏中的各种状态数据。客户端接收到状态数据后...
  • Unity 3D实现帧同步技术

    万次阅读 多人点赞 2017-05-11 15:38:00
    下面介绍一下帧同步模式,帧同步含义游戏客户端接受来自网络的多个客户端的操作,如果这些操作在各个客户端是一样的,那么多个客户端的显示也就一样了,这就带来了“同步”的效果。所以在这种情况下,各个客户端的...
  • 同步的概念 同步技术是数字通信系统中非常重要的技术。一般来说数字通信系统要实现多种同步功能才能实现正确的数据通信任务。其技术目标是实现不同地域收发双方的同步通信互联,实现一致的信息数据交换,因此,通信...
  • 近年来,使用帧同步(Lockstep)的游戏越来越多,关于帧同步和状态同步的讨论争论也有不少,那么到底该选哪种同步机制呢?...这两种同步机制都是为了达到即时同步不同客户端的状态的目的帧同步需要参与..
  • 帧同步优化难点及解决方案

    万次阅读 2018-08-07 18:22:22
    这是侑虎科技第418篇文章,感谢作者Gordon供稿。欢迎转发分享,未经作者授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群465082844) ... 作者也是U Sparkle活动参与者...帧同步这部分...
  • 游戏帧同步学习笔记

    2020-07-31 09:30:20
    文章目录一、前言二、状态同步1、什么是状态同步2、状态同步的流程3、状态同步的特点三、帧同步1、什么是帧同步2、帧同步的流程3、帧同步的特点四、状态同步与帧同步对比 一、前言 现代多人游戏中,多个客户端之间的...
  • 帧同步与状态同步

    2019-06-05 00:01:04
    最近在做的游戏中要用到网络同步的相关知识,因此针对帧同步与状态同步中查询了一些资料,并且涉及了TCP和UDP在游戏网络同步中的一些优缺点的整理,在这里记录一下 帧同步与状态同步 帧同步:服务器负责转化客户端...
  • 滤波法及数字锁相环法位同步提取实验和帧同步提取实验 一实验目的 1掌握滤波法提取位同步信号的原理及其对信息码的要求 2 掌握用数字锁相环提取位同步信号的原理及其对信息代码的要求 3 掌握位同步器的同步建立时间...
  • 01. 帧同步(LockStep)该如何反外挂 在中国的游戏环境下,反挂已经成为了游戏开发的重中之重,甚至能决定一款游戏的生死,吃鸡就是一个典型的案例。 目前参与了了一款动作射击的MOBA类游戏的开发,同步方案上选择...
  • 任何对帧同步有疑问的人,都应该来看这篇文章,这是参考了2个帧同步模型,遇到各种问题并一一解决之后,彻底明白帧同步讲的是什么玩意的一篇文章。断断续续修改了将近2个月,说多了都是泪:(。 言归简短,书归正传。...
  • 电信设备-具备用于重新同步目的的坏指示符装置的通信系统.zip
  • 下面为了测试帧同步
  • 帧同步技术很早就有了,从过去PC时代的war3、星际,到手游时代的王者荣耀、皇室战争。那么如何将其广泛运用于H5游戏开发呢?我们做了个JS版的帧同步SDK,有几十款游戏接入上线。开发者不用关心联网细节,就能高效地...
  • 就可以很轻松的做出一款游戏啦,是不是很简单啊~(手动狗头) 第一章:Socket制作帧同步网络框架 相信小伙伴们都知道Moba类属于强联网游戏,需要使用帧同步网络技术以实时同步传输对局中所有玩家的操作指令,做到无...
  • 终于要写帧同步这块了,这块很难讲清楚,细枝末节有很多优化点,也有一些不同的优化方向,根据不同项目类型,对操作手感的要求,对联机玩家的个数等,会有不同的难点和痛点。不同的优化方向,优化手法的差异,可能...
  • 帧同步扫盲帖

    千次阅读 2017-09-07 21:28:13
    帧同步目的:实际:理解:各客户端每deltatime周期上传操作指令集(eg:左摇杆xy值,右摇杆xy值,按下哪个按钮,抬起哪个按钮); 服务端保存这些操作指令集,并在下一帧将其广播给所有客户端; 客户端收到指令集后...
  •  在技术选型方面,之所以选择帧同步方案,在Kevin的一篇介绍PVP帧同步后台实现的文章中已经做了详细叙述,这里简单摘要如下:  高一致性。如果每一帧的输入都同步了,在同样的上下文中,计算得出的结果应该也是...
  • 参考解密:腾讯如何打造一款实时对战手游从《王者荣耀》来聊聊游戏的帧同步《王者荣耀》技术总监复盘回炉历程:没跨过这三座大山,就是另一款MOBA霸占市场了 纵观AppStore畅销榜前十的游戏,过半都支持玩家实时的...
  • 物理和渲染分开,目的就是确保逻辑的同步性,ab两个客户端pk,手机性能不一样,虽然服务端同时发送,但不能因为a手机配置低,卡了,导致跟不上。 虽然做了跳处理,但加速 不一定要让渲染也加速,否则手机...
  • Unity帧同步相关2

    千次阅读 2018-08-25 18:54:24
    1、确定性 a、随机数:自己写随机函数,服务器提供随机种子 b、浮点数:如果需要运行在不同的机器上,需要使用定点数 c、未初始化变量:某些...f、帧率:不能使用显示帧率,逻辑与显示完全分离,保证逻辑的稳定...
  • 计算机网络-数据链路层帧同步

    千次阅读 热门讨论 2018-02-25 17:35:38
    帧同步指的是接收方应当能从接收到的二进制比特流中区分出帧的起始与终止。概念两个工作站之间以报文分组为单位传输信息时,必须将线路上的数据流划分成报文分组或HDLC(高级数据链路控制)规程的帧,以帧的格式进行...
  • 还有一个问题是反作弊,对于 RTS 和帧同步的方案,只需要定时服务器(或者某个客户的托管服务器,或者大家)校验一下就行了,但是这个只是防止了数据作弊,对于信息泄漏的话可能无解,因为运算和所有数据都在客户端...
  • 比特同步和帧同步的区别

    千次阅读 2016-09-19 21:10:22
    在数据通信中最基本的同步方式就是“比特同步”(bit ...比特同步目的是为了将发送端发送的每一个比特都正确地接收下来。这就要在正确的时刻 (通常就是在每一个比特的中间位置)对收到的电平根据事先已约定

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,072
精华内容 20,028
关键字:

帧同步的目的