最近经常在抖音刷到 棋仙钟珍 的一些经典棋局,看到棋谱的表示法,比如 车二进三、炮二平五、马八进七这些,突然联想到这种棋谱的表示方法,和游戏中的帧同步机制有点类似。
正好最近在做一个帧同步的玩法,就想写一篇文章来分享一下我的一些理解。
帧同步
帧同步是一种网络游戏中常用的数据同步方式,它通过将游戏分为固定的时间帧,每个客户端在每一帧内收集玩家的操作输入,并在帧结束时统一计算游戏状态,从而保证所有玩家看到的游戏状态一致。与之对应的还有状态同步,它是通过不断地同步游戏状态来保证一致性。
帧同步的主要逻辑计算都是在客户端进行的,服务器只负责转发玩家的操作输入,并在每一帧结束时广播当前帧的状态给所有客户端。这样可以减少服务器的计算压力,同时也能降低网络延迟对游戏体验的影响。
断线重连:帧同步游戏在断线重连时,服务器需要把当前游戏的所有帧数据都发给客户端,然后客户端快速回放这些帧数据,直到追上当前的游戏状态。这样可以保证断线重连的玩家能够快速恢复到当前的游戏状态。
状态同步
状态同步的主要逻辑计算在服务器完成,服务器将游戏状态的完整信息发送给客户端,客户端根据接收到的状态进行渲染和操作。这种方式虽然可以保证所有玩家看到的状态一致,但由于需要频繁地传输大量数据,容易受到网络延迟和丢包的影响,从而导致不同玩家看到的状态不一致。
断线重连:状态同步游戏在断线重连时,服务器只需要把当前的游戏状态发送给客户端,客户端根据接收到的状态进行渲染和操作。这样可以保证断线重连的玩家能够快速恢复到当前的游戏状态。
对比
这两种同步方式各有优缺点,帧同步适合对实时性要求较高的游戏,如MOBA,FPS等类型的游戏,而状态同步适合对实时性要求不高的游戏,如如MMORPG,SLG等类型的游戏。状态同步还有一个优点是可以杜绝作弊,因为所有的逻辑计算都在服务器端完成,客户端无法篡改游戏状态。而帧同步则需要在客户端进行逻辑计算,容易受到作弊的影响。
这两种同步方式没有绝对的优劣之分,选择哪种方式取决于游戏的类型和需求。对于实时性要求较高的游戏,帧同步可能是更好的选择,而对于对实时性要求不高的游戏,状态同步可能更适合。
| 帧同步 | 状态同步 | |
|---|---|---|
| 同步内容 | 输入 | 状态 |
| 服务器压力 | 低 | 高 |
| 客户端压力 | 高 | 低 |
| 安全性 | 较低 | 高 |
| 开发难度 | 高 | 低 |
| 网络要求 | 低 | 中 |
| 适合 | RTS、MOBA | MMORPG、SLG |
| 外挂防护 | 困难 | 容易 |
帧同步和棋谱表示法的类比
这两个都是 输入驱动的状态还原 的机制。在中国象棋中,棋谱记录的是每一步棋的操作输入,而不是整个棋盘的状态。通过不断地应用这些操作输入,玩家可以还原出当前的棋盘状态。帧同步游戏也是类似的,客户端记录的是玩家的操作输入,而不是整个游戏状态。通过不断地应用这些操作输入,客户端可以还原出当前的游戏状态。
本质都是
记录输入 → 按确定规则演算 → 重放得到结果
在中国象棋的棋谱表示法中,每一步棋都用类似 车二进三 的方式记录,表示棋子的移动。每一步棋都是对当前棋盘状态的一个操作输入,而不是直接记录整个棋盘的状态。这和帧同步的思想非常相似:帧同步记录的是玩家的操作输入,而不是整个游戏状态。通过不断地应用这些操作输入,客户端可以还原出当前的游戏状态。
帧同步游戏中,如果某一帧的输入记录错误,会导致后续的所有帧都不一致,最终导致游戏状态不一致。就像棋谱中如果有一步棋记录错误,那么后续的棋局也会出现错误,最终导致棋局不一致。
帧同步游戏断线重连时,需要将当前的所有帧数据发送给客户端,客户端快速回放这些帧数据,直到追上当前的游戏状态。像棋谱中也有这样的问题,如果当前棋局状态丢失,需要从头回放之前的棋谱来找回当前的棋局状态。
帧同步和棋谱表示法都依赖确定性。帧同步游戏中,同一个对局中的所有客户端,数据都是一致的,只要初始状态一致 + 输入序列一致 + 逻辑确定,那么最终状态一定一致。棋谱表示法也是一样,只要初始棋盘状态一致 + 棋谱记录一致 + 棋子移动规则确定,那么最终棋局状态一定一致。
帧同步和棋谱的不同点。一般帧同步游戏,以 ticker 为单位,每一帧的时间长度是固定的,客户端需要在每一帧内收集玩家的操作输入,并在帧结束时统一计算游戏状态。而棋谱表示法没有固定的时间长度,在这个对比中,棋谱表示法可以把每次走子的操作看作一帧,棋谱记录的是每一帧的操作输入,而不是整个棋盘的状态。棋谱表示法没有固定的时间长度,每一步棋的操作输入都是独立的,而帧同步游戏中,每一帧的时间长度是固定的,客户端需要在每一帧内收集玩家的操作输入,并在帧结束时统一计算游戏状态。
象棋棋谱可以看作帧同步思想的一个极简版本,但缺少实时性、预测和回滚这些复杂部分。它们最大的共同基础就是:只要初始状态一致 + 输入序列一致 + 逻辑确定,那么最终状态一定一致。
总结
帧同步和棋谱表示法都强调输入驱动的状态还原,通过记录每一步的操作输入,玩家或客户端可以还原出当前的状态。帧同步游戏在实时性、预测和回滚方面比棋谱表示法更复杂,但核心思想是一致的:只要初始状态一致 + 输入序列一致 + 逻辑确定,那么最终状态一定一致。
虽然做游戏好多年了,之前做的游戏基本都是状态同步类型的,现在我刚开始接触帧同步的玩法,很多地方了解的还不够深入,比如预测和回滚机制,断线重连的处理等。写这篇文章的原因主要是这几天看到了棋谱的表示法,突然联想到帧同步的机制,觉得很有意思,就想写下来分享一下我的一些理解。
