【Unity游戏】 帧同步和状态同步

什么是帧同步和状态同步?

多人游戏中客户端之间通信,多以同步多方状态为主要目标。实现这个目标主要有两个技术:帧同步,状态同步

状态同步:客户端发送游戏动作到服务器,服务器收到后,计算游戏行为的结果,把结果广播给所有客户端。客户端收到结果后显示。(回合制游戏可采用这种方式)

帧同步:客户端发送游戏动作到服务器,服务器把动作广播给所有客户端,客户端根据游戏动作来做运算和显示。(红警/星际争霸等连线进行双打游戏,都是这种方式)。这种方式客户端做主要算力。服务器只做转发。

1.状态同步和帧同步的主要区别?

主要的区别在于游戏核心逻辑交互计算写在哪?
状态同步主要逻辑在服务器,客户端更像是服务器数据的表现层。整个游戏的运行开始,交互。角色属性都是服务器传给客户端。
帧同步主要逻辑在客户端。角色移动,攻击,检测,技能等交互计算都在客户端,服务器只是做简单的广播。

一.帧同步技术详解

相同输入 + 相同的时机 = 相同的显示; 各个客户端的运算要绝对一致,不能依赖本地时间或本地随机数等等,一切要以网络来的操作数据为准。

一般帧同步系统中,会有一个Replay Server负责广播所有客户端的数据。为让客户端持续运行,不卡住,需要定时下发一个"网络帧"数据驱动各个客户端。(因客户端已放弃本地时间和本地的循环驱动,所有这些"网络帧"就必不可少。这些网络帧大部分为空,只有当玩家有输入,才会把操作数据填入网络帧数据包中。)

一般来说,多数游戏客户端引擎都会定时调用一个接口函数,这个函数由用户填写内容,用于控制游戏中各种需要显示的内容。例如Unity中Update().这类函数通常会在每帧画面渲染前调用,当用户修改了游戏中各个角色的位置大小后,就会在下一帧画面中显示出来。

在帧同步游戏中,Update()函数依然存在,只不过其大部分内容要移动到另一个类似的函数,暂称为UpdateByNext()-->由网络层不断的接收服务器发来的"网络帧"数据包,每次收到一个这样的数据包都调用一次这个UpdateByNext();这样的话游戏就从通过本地CPU的Update()驱动,改为网络的UpdateByNext()驱动。(注:网络发过来的同步帧速度会明显比本地CPU要慢的多,)

相关推荐
SmalBox9 小时前
02-05-原理篇-资源加载与缓存机制
unity3d·游戏开发
SmalBox1 天前
02-04-原理篇-资源组织与依赖分析
unity3d·游戏开发
SmalBox2 天前
02-03-原理篇-资源打包流程详解
unity3d·游戏开发
SmalBox3 天前
02-02-原理篇-Unity Addressable Assets原理深度解析
unity3d·游戏开发
_zhourui_h_4 天前
Unity 内存数据极限防护:一个 int 藏 8 份密文,修改器到底还能怎么改?
unity3d
SmalBox4 天前
02-01-原理篇-Unity原生AssetBundle原理深度解析
unity3d·游戏开发
fujisheng6614 天前
FUI 验证实战:从 Prefab 节点改名到生成诊断与构建门禁
unity3d
_zhourui_h_5 天前
Unity AssetBundle 打包极限治理:依赖环、重复资源、包体膨胀,怎么在上线前全部揪出来?
unity3d
_zhourui_h_6 天前
Unity AssetBundle 极限管理:依赖、异步加载、引用计数、自动卸载到底怎么串起来?
unity3d
SmalBox6 天前
01-09-认知篇-对比-方案选型矩阵
unity3d·游戏开发