概述
同步就是要多个客户端表现效果是一致的,而且对于大多数的游戏,不仅仅要表现一致,还要客户端和服务器的数据也是一致的。所以同步是个网络游戏概念,只有网络游戏才需要同步,而单机游戏是不需要同步的。
帧同步和状态同步是在网络游戏和多人在线应用中常见的两种同步方法,它们用于确保所有参与者看到的游戏状态一致。
帧同步概念
帧同步是一种同步方式,其中每个客户端都在相同的逻辑帧上执行相同的操作。在这种方式下,游戏状态的更新在固定时间间隔(例如,每秒30帧)内进行。客户端只需发送用户输入,而无需发送整个游戏状态。服务器会将所有客户端的输入收集在一起,并在每个逻辑帧上广播给所有客户端。客户端在收到其他客户端的输入后,根据这些输入更新游戏状态。
适用场景:帧同步适合对实时性要求较高、用户交互较为频繁的游戏,如实时策略游戏、格斗游戏等。
状态同步概念
同步的是游戏中的各种状态,是指的将其他玩家的状态行为同步的方式,一般情况下AI逻辑,技能逻辑,战斗计算都由服务器运算,只是将运算的结果同步给客户端,客户端只需要接受服务器传过来的状态变化,然后更新自己本地的动作状态、Buff状态,位置等就可以了
(但是为了给玩家好的体验,减少同步的数据量,客户端也会做很多的本地运算,减少服务器同步的频率以及数据量。)
这里客户端相当于服务器的播放器一样,因为核心的判断都是在服务器的,一切的表现和属性都以服务器为准,就算客户端的血条是满的,服务器的血条是0,那依旧要死。
适用场景:状态同步适合对实时性要求较低、状态变化较少的游戏,如回合制策略游戏、棋类游戏等。
实例:一个角色要释放一个技能(非指向技能),
客户端告诉服务器我要释放一个技能
服务器通知所有客户端在某个地方以什么方向释放技能
客户端根据收到的信息创建一个特效放在这个地方,然后以某个方向飞行
服务器根据碰撞检测判断到某个时刻碰到了地方英雄,通知客户端
客户端根据服务器发来的信息删除特效,被打到的人减少血量播放收击特效
对比
选择帧同步还是状态同步取决于以下因素:
- 实时性要求:帧同步更适合实时性要求高的游戏,状态同步适用于实时性要求较低的游戏。
- 网络带宽和延迟:帧同步对延迟和网络的带宽要求较高,而状态同步对延迟和网络的带宽要求相对较低。
- 游戏类型和交互复杂性:帧同步更适合用户交互频繁的游戏,状态同步适用于状态变化较少的游戏。
- 容错性:帧同步对客户端和服务器之间的同步精度要求较高,容错性较低。状态同步在一定程度上可以容忍不同客户端之间的状态差异。
帧同步只需要接受输入和输出,在客户端上进行逻辑运算,因此传播流量小,速度快,实时性高。状态同步则需要将玩家的状态各种信息也要传输,因而流量大,速度慢。
状态同步 | 帧同步 | |
---|---|---|
流量 | 相对高 | 相对低 |
回放 | 记录文件大 | 记录文件小 |
安全性 | 服务器实现逻辑,安全性高 | 逻辑再客户端计算,反外挂压力大,无法避免开图挂 |
服务器压力 | 大 | 小 |
战斗校验 | 协议加密,内存混淆,误差校验,无法彻底解决 | 服务器可以重启跑一遍战斗 |
网络卡顿的表现 | 瞬移,回位,莫名掉血 | 战斗卡顿 |
实现 | 调优状态同步方式,客户端需要做插值处理 | 客户端按照单机方式开发,保证逻辑层和表现层分离。逻辑层不要用到浮点数,不要用不确定顺序的逻辑结构 |
开发效率 | 同一个功能至少需要一个客户端和服务器共同完成,开发困难,但仍然占据主流 | 服务器开发难度低,只负责转发,开发效率高 |
断线重连 | 状态同步很简单,重新把整个场景中的任务全部重新生成一边,各种数值根据服务端提供的信息加到任务身上即可。 | 帧同步的断线重连时比较麻烦的,当你在10分钟的时候断线了,在15分钟回来,就需要把服务器这15分钟的消息一次性的发送给客户端,然后客户端加速整个游戏的核心逻辑运算,直到追上现有进度。 |