【架构-30】状态同步和事故同步

打印 上一主题 下一主题

主题 982|帖子 982|积分 2956

在多人在线应用中,状态同步和事故同步是两种常见的同步方式,用于保持各个客户端之间的状态同等性。它们的主要区别在于同步的内容和实用的场景。以下是对状态同步和事故同步的详细表明及它们之间的区别。
状态同步

状态同步是指不停同步对象的状态(如位置、旋转、动画状态等)来确保差别客户端上的表现同等。状态同步是实时、连续的,适合必要连续更新的场景。
工作方式


  • 连续更新:定期将对象的状态(如位置、旋转、速率等)从一个客户端或服务器发送到其他客户端。
  • 插值和预测:为了减少延迟和提拔用户体验,常用插值(Interpolation)和预测(Prediction)技能,确保对象的活动在差别客户端上流通。
  • 高频率同步:由于状态是不停变化的,因此同步频率通常较高,必要在每帧或固定时间间隔进行同步。
示例


  • 玩家移动:在多人游戏中,玩家的移动是连续的,必须不停同步位置和方向,以确保每个客户端上看到的玩家活动是同等的。
  • 动画状态:角色的动画(如跑步、跳跃等)在每个客户端上必须同步,以保持动画的连贯性。
  1. public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
  2. {
  3.     if (stream.IsWriting)
  4.     {
  5.         // 发送当前对象状态(如位置和旋转)
  6.         stream.SendNext(transform.position);
  7.         stream.SendNext(transform.rotation);
  8.     }
  9.     else
  10.     {
  11.         // 接收其他客户端发送的对象状态
  12.         transform.position = (Vector3)stream.ReceiveNext();
  13.         transform.rotation = (Quaternion)stream.ReceiveNext();
  14.     }
  15. }
复制代码
长处


  • 实时同等:可以或许确保对象的状态在所有客户端上尽可能保持同等。
  • 用户体验好:通过平滑的插值和预测,减少网络延迟对体验的影响。
缺点


  • 带宽占用高:由于必要频繁发送数据,状态同步会占用大量带宽。
  • 延迟敏感:网络延迟和丢包可能导致状态差别步,影响用户体验。
事故同步

事故同步是指同步一次性发生的动作或事故,而不是连续同步状态。这种方式更适合于发生频率较低且有明确界限的操作,如按钮点击、攻击指令等。
工作方式


  • 基于触发:当事故发生时(如玩家按下攻击键),将事故信息发送给其他客户端。
  • 事故处置惩罚:接收到事故后,其他客户端根据事故信息做出相应的处置惩罚(如播放攻击动画)。
  • 低频率同步:事故是离散的,不必要连续发送,因此同步频率通常较低。
示例


  • 攻击指令:当玩家按下攻击按钮时,发送“攻击”事故给其他客户端,然后触发相应的动画和结果。
  • 开关互动:玩家触发开关或按钮,事故同步通知所有客户端进行状态更新。
  1. // 事件发送
  2. photonView.RPC("TriggerAttack", RpcTarget.All);
  3. // 事件接收与处理
  4. [PunRPC]
  5. public void TriggerAttack()
  6. {
  7.     // 播放攻击动画
  8.     animator.SetTrigger("Attack");
  9. }
复制代码
长处


  • 带宽服从高:只在事故发生时同步,减少不必要的数据传输。
  • 不延迟敏感:由于是离散事故,较小的网络延迟通常不会影响操作。
缺点


  • 同等性题目:事故之间可能会因为网络延迟导致差别步(如攻击动作和实际伤害差别步)。
  • 难以处置惩罚连续状态:对于必要连续同步的数据,事故同步无法实用。

什么时候使用哪种同步方式?



  • 状态同步:实用于必要连续跟踪和更新的数据,如玩家的移动、旋转、物体的物理状态等,保证场景的同等性和实时性。
  • 事故同步:实用于单次触发的操作,如按键操作、玩家攻击、交互举动等,不必要连续同步。
综合使用
在多人在线场景中,通常会结合使用状态同步和事故同步。比如在一个多人游戏中,玩家的移动使用状态同步,而技能开释或攻击使用事故同步。通过机动组合这两种同步方式,可以优化网络性能,同时保持精良的用户体验。
浅近易懂的表明:


  • 状态同步
    想象有两个小朋友在差别的地方画画。状态同步就像是他们每隔一段时间就相互展示本身的画纸,告诉对方本身画到什么水平了。具体来说:


  • 状态同步是把系统中某个对象的当前完整状态信息发送给其他相干的部分。比如在一个多人在线游戏中,玩家 A 的角色在游戏天下中的位置、血量、装备等所有状态信息会定期发送给其他玩家的客户端。这样其他玩家就能看到玩家 A 的角色在游戏天下中的正确状态。假如玩家 A 的角色移动了位置,那么新的位置信息以及其他相干状态信息会再次发送出去,让其他玩家的游戏画面中这个角色的状态与实际情况保持同等。
  • 长处是接收方可以直接获得对象的完整状态,便于快速更新和出现。但缺点是假如状态信息比较复杂大概频繁变化,可能会产生较大的数据量,占用较多的网络带宽。

  • 事故同步
    还是那两个小朋友画画,事故同步就像是其中一个小朋友只告诉另一个小朋友本身做了什么动作,比如 “我在画纸上画了一个圆圈”。具体来说:


  • 事故同步是只将系统中发生的关键事故信息发送出去。比如在一个股票交易系统中,当一只股票的价格发生变化时,系统只发送价格变化这个事故信息,而不是发送整个股票市场的所有状态信息。接收方根据接收到的事故信息来更新本身的状态。
  • 长处是数据量通常比较小,占用网络带宽少。而且在一些情况下,事故同步可以更好地反映系统的动态变化过程。但缺点是接收方必要根据事故信息来逐步更新本身的状态,假如事故处置惩罚逻辑复杂,可能会增长处置惩罚的难度和时间。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

来自云龙湖轮廓分明的月亮

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表