目录
数据同步
在联机游戏中,我的操作和数据要同步给同一局游戏中其他所有玩家,其他玩家的操作和数据也会同步给我。这叫做数据同步,目前数据同步的方式则有帧同步和状态同步。
状态同步:将操作发送给服务端,服务端对操作进行运算并下发状态,客户端接收并播放状态
- 发操作
- 收状态
帧同步:将操作发送给服务端,服务器不进行任何运算把操作传给客户端,客户端在本地进行运算
- 发操作
- 收操作
适合帧同步的游戏:
- 网络波动比较大
- 追求即时反馈:FPS、MOBA、SPT
- 控制大量游戏单位:RTS
通过比较来看状态同步和帧同步
拿小编熟悉的红色警戒举例:假如我和你在联机对战,你要控制100个小兵移动到我的基地。
状态同步
- 客户端要将被选中的100个小兵信息和目标点发送给服务器
- 服务器通过计算100个小兵的移动速度和100个小兵当前位置信息定时返回给我俩的客户端
- 直到100个小兵到达我的基地。
由此可见(控制大量游戏单位)的这种游戏如果采用状态同步会给服务器造成多大压力
帧同步
同样场景如果采用帧同步:
- 客户端将帧号(帧号表明当前游戏进行到第几副画面了)、100个小兵的信息、目标点发送给服务器。
- 服务器一次性返回给我俩的客户端帧号、100个小兵的信息、目标点。
- 我俩各自的客户端通过同步帧号进行本地运算处理小兵当前的位置信息,直到他们达到目标点。
帧同步实现需要的条件
一套完整的帧同步游戏框架要实现什么?
- 可靠的UDP:实现 时序性 、 重传机制 、 应答机制 、 消除最小延迟
- 确定性的数学和物理运算库:浮点数在电脑运算存在不精确性 —— 如何解决:取整计算、容许小概率误差、逻辑表现分离
- 断线重连:大家玩王者如果卡了或者断线,恢复之后大家会看到像用倍速看电影那样的画面,这是通过追帧的方式重连游戏
- 比赛回放:服务器记录关键帧;下发客户端进行重放
- 反作弊:重演、仲裁;一局游戏有五个人,那他们提交到服务器的操作记录是相同的,如果有人记录不相同说明存在作弊现象
- 避免等待
两者相比较
状态同步 vs 帧同步
特性 | 状态同步 | 帧同步 |
---|---|---|
服务器角色 | 计算游戏状态,广播给客户端 | 只转发输入,不计算状态 |
客户端角色 | 显示服务器状态,发送输入 | 独立计算游戏状态 |
防作弊能力 | 强(逻辑在服务器端) | 弱(逻辑在客户端) |
网络要求 | 允许一定延迟,可通过预测缓解 | 要求严格同步,延迟影响大 |
适用游戏类型 | FPS、MOBA、MMORPG等 | RTS、棋牌类游戏等 |
两者结合:状态帧同步
状态帧同步就是状态同步和帧同步的概念相结合。客户端向服务器上传操作,服务器跑逻辑,但是又在按照固定的每一帧下发所有玩家的状态(属性位置等)给每一个客户端实现同步。
这里最具典型的就是守望先锋就是采用的状态帧同步的概念。在这个概念中,服务器和客户端都是有一套相同的代码的,但是客户端的逻辑代码更偏向于用来做预测行为,客户端可以预测主玩家的行为,让主玩家不需要等待服务器的快照就能直接执行玩家按下的操作,这样就能增加玩家的体验,而当服务器下发快照的时候,玩家再去验证自己的预测是否正确,不正确的就对操作进行回滚。