Featured image of post 由中国象棋的棋谱表示法联想到游戏中的帧同步 - QX's blog

由中国象棋的棋谱表示法联想到游戏中的帧同步

本文通过中国象棋的中文棋谱表示法,联想到游戏中的帧同步机制,分析两者的相似性和差异性,并探讨帧同步在游戏开发中的应用。

最近经常在抖音刷到 棋仙钟珍 的一些经典棋局,看到棋谱的表示法,比如 车二进三炮二平五马八进七这些,突然联想到这种棋谱的表示方法,和游戏中的帧同步机制有点类似。

正好最近在做一个帧同步的玩法,就想写一篇文章来分享一下我的一些理解。

帧同步

帧同步是一种网络游戏中常用的数据同步方式,它通过将游戏分为固定的时间帧,每个客户端在每一帧内收集玩家的操作输入,并在帧结束时统一计算游戏状态,从而保证所有玩家看到的游戏状态一致。与之对应的还有状态同步,它是通过不断地同步游戏状态来保证一致性。

帧同步的主要逻辑计算都是在客户端进行的,服务器只负责转发玩家的操作输入,并在每一帧结束时广播当前帧的状态给所有客户端。这样可以减少服务器的计算压力,同时也能降低网络延迟对游戏体验的影响。

断线重连:帧同步游戏在断线重连时,服务器需要把当前游戏的所有帧数据都发给客户端,然后客户端快速回放这些帧数据,直到追上当前的游戏状态。这样可以保证断线重连的玩家能够快速恢复到当前的游戏状态。

状态同步

状态同步的主要逻辑计算在服务器完成,服务器将游戏状态的完整信息发送给客户端,客户端根据接收到的状态进行渲染和操作。这种方式虽然可以保证所有玩家看到的状态一致,但由于需要频繁地传输大量数据,容易受到网络延迟和丢包的影响,从而导致不同玩家看到的状态不一致。

断线重连:状态同步游戏在断线重连时,服务器只需要把当前的游戏状态发送给客户端,客户端根据接收到的状态进行渲染和操作。这样可以保证断线重连的玩家能够快速恢复到当前的游戏状态。

对比

这两种同步方式各有优缺点,帧同步适合对实时性要求较高的游戏,如MOBA,FPS等类型的游戏,而状态同步适合对实时性要求不高的游戏,如如MMORPG,SLG等类型的游戏。状态同步还有一个优点是可以杜绝作弊,因为所有的逻辑计算都在服务器端完成,客户端无法篡改游戏状态。而帧同步则需要在客户端进行逻辑计算,容易受到作弊的影响。

这两种同步方式没有绝对的优劣之分,选择哪种方式取决于游戏的类型和需求。对于实时性要求较高的游戏,帧同步可能是更好的选择,而对于对实时性要求不高的游戏,状态同步可能更适合。

帧同步状态同步
同步内容输入状态
服务器压力
客户端压力
安全性较低
开发难度
网络要求
适合RTS、MOBAMMORPG、SLG
外挂防护困难容易

帧同步和棋谱表示法的类比

这两个都是 输入驱动的状态还原 的机制。在中国象棋中,棋谱记录的是每一步棋的操作输入,而不是整个棋盘的状态。通过不断地应用这些操作输入,玩家可以还原出当前的棋盘状态。帧同步游戏也是类似的,客户端记录的是玩家的操作输入,而不是整个游戏状态。通过不断地应用这些操作输入,客户端可以还原出当前的游戏状态。

本质都是

记录输入 → 按确定规则演算 → 重放得到结果

在中国象棋的棋谱表示法中,每一步棋都用类似 车二进三 的方式记录,表示棋子的移动。每一步棋都是对当前棋盘状态的一个操作输入,而不是直接记录整个棋盘的状态。这和帧同步的思想非常相似:帧同步记录的是玩家的操作输入,而不是整个游戏状态。通过不断地应用这些操作输入,客户端可以还原出当前的游戏状态。

帧同步游戏中,如果某一帧的输入记录错误,会导致后续的所有帧都不一致,最终导致游戏状态不一致。就像棋谱中如果有一步棋记录错误,那么后续的棋局也会出现错误,最终导致棋局不一致。

帧同步游戏断线重连时,需要将当前的所有帧数据发送给客户端,客户端快速回放这些帧数据,直到追上当前的游戏状态。像棋谱中也有这样的问题,如果当前棋局状态丢失,需要从头回放之前的棋谱来找回当前的棋局状态。

帧同步和棋谱表示法都依赖确定性。帧同步游戏中,同一个对局中的所有客户端,数据都是一致的,只要初始状态一致 + 输入序列一致 + 逻辑确定,那么最终状态一定一致。棋谱表示法也是一样,只要初始棋盘状态一致 + 棋谱记录一致 + 棋子移动规则确定,那么最终棋局状态一定一致。

帧同步和棋谱的不同点。一般帧同步游戏,以 ticker 为单位,每一帧的时间长度是固定的,客户端需要在每一帧内收集玩家的操作输入,并在帧结束时统一计算游戏状态。而棋谱表示法没有固定的时间长度,在这个对比中,棋谱表示法可以把每次走子的操作看作一帧,棋谱记录的是每一帧的操作输入,而不是整个棋盘的状态。棋谱表示法没有固定的时间长度,每一步棋的操作输入都是独立的,而帧同步游戏中,每一帧的时间长度是固定的,客户端需要在每一帧内收集玩家的操作输入,并在帧结束时统一计算游戏状态。

象棋棋谱可以看作帧同步思想的一个极简版本,但缺少实时性、预测和回滚这些复杂部分。它们最大的共同基础就是:只要初始状态一致 + 输入序列一致 + 逻辑确定,那么最终状态一定一致。

总结

帧同步和棋谱表示法都强调输入驱动的状态还原,通过记录每一步的操作输入,玩家或客户端可以还原出当前的状态。帧同步游戏在实时性、预测和回滚方面比棋谱表示法更复杂,但核心思想是一致的:只要初始状态一致 + 输入序列一致 + 逻辑确定,那么最终状态一定一致。

虽然做游戏好多年了,之前做的游戏基本都是状态同步类型的,现在我刚开始接触帧同步的玩法,很多地方了解的还不够深入,比如预测和回滚机制,断线重连的处理等。写这篇文章的原因主要是这几天看到了棋谱的表示法,突然联想到帧同步的机制,觉得很有意思,就想写下来分享一下我的一些理解。

发表了70篇文章 · 总计178.69k字
本博客已稳定运行
© QX
使用 Hugo 构建
主题 StackJimmy 设计