数据同步
在联机游戏中,我的操作和数据要同步给同一局游戏中其他所有玩家,其他玩家的操作和数据也会同步给我。这叫做数据同步,目前数据同步的方式则有帧同步和状态同步。
状态同步:将操作发送给服务端,服务端对操作进行运算并下发状态,客户端接收并播放状态
- 发操作
- 收状态
帧同步:将操作发送给服务端,服务器不进行任何运算把操作传给客户端,客户端在本地进行运算
- 发操作
- 收操作
适合帧同步的游戏:
- 网络波动比较大
- 追求即时反馈:FPS、MOBA、SPT
- 控制大量游戏单位:RTS
通过比较来看状态同步和帧同步
拿小编熟悉的红色警戒举例:假如我和你在联机对战,你要控制100个小兵移动到我的基地。
状态同步
- 客户端要将被选中的100个小兵信息和目标点发送给服务器
- 服务器通过计算100个小兵的移动速度和100个小兵当前位置信息定时返回给我俩的客户端
- 直到100个小兵到达我的基地。
由此可见(控制大量游戏单位)的这种游戏如果采用状态同步会给服务器造成多大压力
帧同步
同样场景如果采用帧同步:
- 客户端将帧号(帧号表明当前游戏进行到第几副画面了)、100个小兵的信息、目标点发送给服务器。
- 服务器一次性返回给我俩的客户端帧号、100个小兵的信息、目标点。
- 我俩各自的客户端通过同步帧号进行本地运算处理小兵当前的位置信息,直到他们达到目标点。
帧同步实现需要的条件
一套完整的帧同步游戏框架要实现什么?
- 可靠的UDP:实现 时序性 、 重传机制 、 应答机制 、 消除最小延迟
- 确定性的数学和物理运算库:浮点数在电脑运算存在不精确性 —— 如何解决:取整计算、容许小概率误差、逻辑表现分离
- 断线重连:大家玩王者如果卡了或者断线,恢复之后大家会看到像用倍速看电影那样的画面,这是通过追帧的方式重连游戏
- 比赛回放:服务器记录关键帧;下发客户端进行重放
- 反作弊:重演、仲裁;一局游戏有五个人,那他们提交到服务器的操作记录是相同的,如果有人记录不相同说明存在作弊现象
- 避免等待