网络游戏同步基础

时间:2022-06-01 21:22:56

http://www.zhust.com/index.php/2014/02/%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F%E7%9A%84%E7%A7%BB%E5%8A%A8%E5%90%8C%E6%AD%A5%EF%BC%88%E4%B8%80%EF%BC%89%E7%BD%91%E7%BB%9C%E5%90%8C%E6%AD%A5%E6%BC%94%E7%A4%BA/#comment-4847

关键词

  • 帧同步
  • 状态同步
  • LockStep
  • Timebucket
  • Timewarp
  • Dead Reckoning
  • Client-side Prediction
  • Server-side Latency Compensation
  • 延时、抖动、丢包率
  • UDP vs. TCP

主流的网络游戏同步方式一览

  • MOBA
        王者荣耀:帧同步
        WAR3:帧同步
        全民超神:状态同步
        乱斗西游:状态同步
        LOL:状态同步
        Dota2:状态同步
  • MMO
        MMO均采用状态同步,如魔兽世界
  • FPS
        FPS类游戏大多采用状态同步
  • 动作格斗类游戏
        街机三国:帧同步
  • 体育竞技类游戏
        NBA2K OL:帧同步

网络游戏同步“大”分类

  • Peer-to-Peer Lockstep
        早期的网络拓扑模型
  • Client/Server
        The Server is the Man
  • Client-Side Prediction
        客户端预测和延迟补偿,“消除”网络延迟

什么是帧同步?

War3/星际等采用,基于指令驱动各个客户端自计算逻辑。服务端只管分发指令,每个客户端根据完整的规则运算整个战场。
每个客户端播放效果就像是看视频。
对视觉同步要求较高。

核心

保证所有客户端每帧的输入都一样--同步性
相同的输入下要有相同的输出--确定性

优点

  • 因为只需要同步指令,所以流量消耗非常小

缺点

  • 断线需要补帧,即一旦你的战场状态没有了,必须从头开始,从第一个指令运算到连回去的战场状态。

什么是LockStep?

典型的一种帧同步算法,最早用于P2P。Lockstep把游戏过程划分成了一个个turn,只有当每个turn集齐了所有玩家的操作指令,也就是输入确定了之后,才可以进行计算,进入下一个turn,否则就要等待最慢的玩家。
使用Lockstep的游戏是严格按照turn向前推进的,如果有人延迟比较高,其他玩家必须等待该玩家跟上之后再继续计算,不存在某个玩家领先或落后其他玩家若干个turn的情况。使用Lockstep同步机制的游戏中,每个玩家的延迟都等于延迟最高的那个人。

什么是Timebucket?

设置了 bucket的概念, 执行每一帧的时间是固定的 bucket 时间节点, 而不必等到收到所有的 client step 指令, 从而网络不再受最差的 client 限制.

什么是状态同步?

MMORPG的主要实现方式,服务器负责计算全部的游戏逻辑,并且广播这些计算的结果,客户端仅仅负责发送玩家的操作,以及表现收到的游戏结果。一般来说,玩家发送一个操作到服务器上,服务器根据玩家操作去修改内存中的游戏世界模型,同时运算游戏世界对这个操作的反应,然后把这些反应都广播给相关的多个客户端,每个客户端负责把这些数据表现出来给玩家看。
一句话,The Server is the Man!

什么是DR?

Dead Reckoning,导航推测算法,即客户端模拟运动轨迹和路线,如果真实坐标和模拟坐标的差值大于某个极限误差的时候则广播,收到消息后进行平缓的拉扯处理。
属于客户端预测。

什么是Timewarp?

客户端先行,发现逻辑不一致的时候,进行回滚。

什么是延迟补偿?

服务器端考虑了客户端的网络延迟,将服务器状态回滚到延迟前,再进行运算。

什么是延时、抖动、丢包率?

ping kingsoft.cn
正在 Ping kingsoft.cn [192.168.12.19] 具有 32 字节的数据:
来自 192.168.12.19 的回复: 字节=32 时间=5ms TTL=123
来自 192.168.12.19 的回复: 字节=32 时间=6ms TTL=123
来自 192.168.12.19 的回复: 字节=32 时间=5ms TTL=123
请求超时。
192.168.12.19 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 3,丢失 = 1 (25% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 4ms,最长 = 6ms,平均 = 5ms
______________________________________
注:延时5ms
抖动:(4ms-5ms)~(6ms-5ms),即-1ms~+1ms,[最短延时-平均延时] ~ [最长延时-平均延时]
丢包率:25%

如何选择协议?

TCP vs. UDP
乱斗西游采用的是UDP
NBA2K OL存在用的是UDP
补充一句:使用哪种同步方式和协议方式没有必然联系;比如乱斗西游是UDP+状态同步,而街机三国是TCP(TCP_NODELAY) + 帧同步

注:可参考本人的上一篇文章:
Networking Basics:TCP and UDP Basics

帧同步如何防外挂?

如果初始状态一样和随机种子一样,那么只要每帧的输入高度一样(因为是由服务器切帧分发的,可以保持每个客户端的输入序列是一样的),那么每帧的运算结果也是一样的。为此让每个客户端验证每帧的结果是不是与其它几个客户端是一模一样的,我们就可以拿来做为校验原因。只要有不一样的结果,即有人做弊。

为什么MMO不能用帧同步?

帧同步的[所有人]的输入必须在[所有客户端]进行计算,这样大家运算出来的结果才能一样,才能保证帧同步.注意是【所有人】.所以常见用于rts,moba、2k等房间游戏.因为人数固定.但是mmo中玩家不定,如果同步所有人。。这个带宽(即传输问题)。。所以mmo中用状态同步+aoi视野管理.

References