什么是帧同步和状态同步?
多人游戏中客户端之间通信,多以同步多方状态为主要目标。实现这个目标主要有两个技术:帧同步,状态同步
状态同步:客户端发送游戏动作到服务器,服务器收到后,计算游戏行为的结果,把结果广播给所有客户端。客户端收到结果后显示。(回合制游戏可采用这种方式)
帧同步:客户端发送游戏动作到服务器,服务器把动作广播给所有客户端,客户端根据游戏动作来做运算和显示。(红警/星际争霸等连线进行双打游戏,都是这种方式)。这种方式客户端做主要算力。服务器只做转发。
1.状态同步和帧同步的主要区别?
主要的区别在于游戏核心逻辑交互计算写在哪?
状态同步
主要逻辑在服务器,客户端更像是服务器数据的表现层。整个游戏的运行开始,交互。角色属性都是服务器传给客户端。
帧同步
主要逻辑在客户端。角色移动,攻击,检测,技能等交互计算都在客户端,服务器只是做简单的广播。
一.帧同步技术详解
相同输入 + 相同的时机 = 相同的显示;
各个客户端的运算要绝对一致,不能依赖本地时间或本地随机数等等,一切要以网络来的操作数据为准。
一般帧同步系统中,会有一个Replay Server负责广播所有客户端的数据。为让客户端持续运行,不卡住,需要定时下发一个"网络帧"
数据驱动各个客户端。(因客户端已放弃本地时间和本地的循环驱动,所有这些"网络帧"就必不可少。这些网络帧大部分为空,只有当玩家有输入,才会把操作数据填入网络帧数据包中。)
一般来说,多数游戏客户端引擎都会定时调用一个接口函数,这个函数由用户填写内容,用于控制游戏中各种需要显示的内容。例如Unity中Update().这类函数通常会在每帧画面渲染前调用,当用户修改了游戏中各个角色的位置大小后,就会在下一帧画面中显示出来。
在帧同步游戏中,Update()函数依然存在,只不过其大部分内容要移动到另一个类似的函数,暂称为UpdateByNext()-->由网络层不断的接收服务器发来的"网络帧"数据包,每次收到一个这样的数据包都调用一次这个UpdateByNext();这样的话游戏就从通过本地CPU的Update()驱动,改为网络的UpdateByNext()驱动。(注:网络发过来的同步帧速度会明显比本地CPU要慢的多,)