<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>游戏开发 on QX 的笔记</title><link>https://lqxhub.github.io/categories/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/</link><description>Recent content in 游戏开发 on QX 的笔记</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sun, 26 Jul 2026 20:19:17 +0800</lastBuildDate><atom:link href="https://lqxhub.github.io/categories/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/index.xml" rel="self" type="application/rss+xml"/><item><title>由中国象棋的棋谱表示法联想到游戏中的帧同步 - QX's blog</title><link>https://lqxhub.github.io/posts/16436974/</link><pubDate>Sun, 26 Jul 2026 20:19:17 +0800</pubDate><guid>https://lqxhub.github.io/posts/16436974/</guid><description>&lt;img src="https://cdn.jsdelivr.net/gh/lqxhub/images@master/blog/4144413028261121f32235ee681c1204e888d88e.jpg" alt="Featured image of post 由中国象棋的棋谱表示法联想到游戏中的帧同步 - QX's blog" />&lt;p>最近经常在抖音刷到 棋仙钟珍 的一些经典棋局，看到棋谱的表示法，比如 &lt;strong>车二进三&lt;/strong>、&lt;strong>炮二平五&lt;/strong>、&lt;strong>马八进七&lt;/strong>这些，突然联想到这种棋谱的表示方法，和游戏中的帧同步机制有点类似。&lt;/p>
&lt;p>正好最近在做一个帧同步的玩法，就想写一篇文章来分享一下我的一些理解。&lt;/p>
&lt;h2 id="帧同步">&lt;a href="#%e5%b8%a7%e5%90%8c%e6%ad%a5" class="header-anchor">&lt;/a>帧同步
&lt;/h2>&lt;p>帧同步是一种网络游戏中常用的数据同步方式，它通过将游戏分为固定的时间帧，每个客户端在每一帧内收集玩家的操作输入，并在帧结束时统一计算游戏状态，从而保证所有玩家看到的游戏状态一致。与之对应的还有状态同步，它是通过不断地同步游戏状态来保证一致性。&lt;/p>
&lt;p>帧同步的主要逻辑计算都是在客户端进行的，服务器只负责转发玩家的操作输入，并在每一帧结束时广播当前帧的状态给所有客户端。这样可以减少服务器的计算压力，同时也能降低网络延迟对游戏体验的影响。&lt;/p>
&lt;p>断线重连：帧同步游戏在断线重连时，服务器需要把当前游戏的所有帧数据都发给客户端，然后客户端快速回放这些帧数据，直到追上当前的游戏状态。这样可以保证断线重连的玩家能够快速恢复到当前的游戏状态。&lt;/p>
&lt;h2 id="状态同步">&lt;a href="#%e7%8a%b6%e6%80%81%e5%90%8c%e6%ad%a5" class="header-anchor">&lt;/a>状态同步
&lt;/h2>&lt;p>状态同步的主要逻辑计算在服务器完成，服务器将游戏状态的完整信息发送给客户端，客户端根据接收到的状态进行渲染和操作。这种方式虽然可以保证所有玩家看到的状态一致，但由于需要频繁地传输大量数据，容易受到网络延迟和丢包的影响，从而导致不同玩家看到的状态不一致。&lt;/p>
&lt;p>断线重连：状态同步游戏在断线重连时，服务器只需要把当前的游戏状态发送给客户端，客户端根据接收到的状态进行渲染和操作。这样可以保证断线重连的玩家能够快速恢复到当前的游戏状态。&lt;/p>
&lt;h2 id="对比">&lt;a href="#%e5%af%b9%e6%af%94" class="header-anchor">&lt;/a>对比
&lt;/h2>&lt;p>这两种同步方式各有优缺点，帧同步适合对实时性要求较高的游戏，如MOBA，FPS等类型的游戏，而状态同步适合对实时性要求不高的游戏，如如MMORPG，SLG等类型的游戏。状态同步还有一个优点是可以杜绝作弊，因为所有的逻辑计算都在服务器端完成，客户端无法篡改游戏状态。而帧同步则需要在客户端进行逻辑计算，容易受到作弊的影响。&lt;/p>
&lt;p>这两种同步方式没有绝对的优劣之分，选择哪种方式取决于游戏的类型和需求。对于实时性要求较高的游戏，帧同步可能是更好的选择，而对于对实时性要求不高的游戏，状态同步可能更适合。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>帧同步&lt;/th>
&lt;th>状态同步&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>同步内容&lt;/td>
&lt;td>输入&lt;/td>
&lt;td>状态&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>服务器压力&lt;/td>
&lt;td>低&lt;/td>
&lt;td>高&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>客户端压力&lt;/td>
&lt;td>高&lt;/td>
&lt;td>低&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>安全性&lt;/td>
&lt;td>较低&lt;/td>
&lt;td>高&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>开发难度&lt;/td>
&lt;td>高&lt;/td>
&lt;td>低&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>网络要求&lt;/td>
&lt;td>低&lt;/td>
&lt;td>中&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>适合&lt;/td>
&lt;td>RTS、MOBA&lt;/td>
&lt;td>MMORPG、SLG&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>外挂防护&lt;/td>
&lt;td>困难&lt;/td>
&lt;td>容易&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="帧同步和棋谱表示法的类比">&lt;a href="#%e5%b8%a7%e5%90%8c%e6%ad%a5%e5%92%8c%e6%a3%8b%e8%b0%b1%e8%a1%a8%e7%a4%ba%e6%b3%95%e7%9a%84%e7%b1%bb%e6%af%94" class="header-anchor">&lt;/a>帧同步和棋谱表示法的类比
&lt;/h2>&lt;p>这两个都是 &lt;strong>输入驱动的状态还原&lt;/strong> 的机制。在中国象棋中，棋谱记录的是每一步棋的操作输入，而不是整个棋盘的状态。通过不断地应用这些操作输入，玩家可以还原出当前的棋盘状态。帧同步游戏也是类似的，客户端记录的是玩家的操作输入，而不是整个游戏状态。通过不断地应用这些操作输入，客户端可以还原出当前的游戏状态。&lt;/p>
&lt;p>本质都是&lt;/p>
&lt;blockquote>
&lt;p>记录输入 → 按确定规则演算 → 重放得到结果&lt;/p>
&lt;/blockquote>
&lt;p>在中国象棋的棋谱表示法中，每一步棋都用类似 &lt;strong>车二进三&lt;/strong> 的方式记录，表示棋子的移动。每一步棋都是对当前棋盘状态的一个操作输入，而不是直接记录整个棋盘的状态。这和帧同步的思想非常相似：帧同步记录的是玩家的操作输入，而不是整个游戏状态。通过不断地应用这些操作输入，客户端可以还原出当前的游戏状态。&lt;/p>
&lt;p>帧同步游戏中，如果某一帧的输入记录错误，会导致后续的所有帧都不一致，最终导致游戏状态不一致。就像棋谱中如果有一步棋记录错误，那么后续的棋局也会出现错误，最终导致棋局不一致。&lt;/p>
&lt;p>帧同步游戏断线重连时，需要将当前的所有帧数据发送给客户端，客户端快速回放这些帧数据，直到追上当前的游戏状态。像棋谱中也有这样的问题，如果当前棋局状态丢失，需要从头回放之前的棋谱来找回当前的棋局状态。&lt;/p>
&lt;p>帧同步和棋谱表示法都依赖确定性。帧同步游戏中，同一个对局中的所有客户端，数据都是一致的，只要初始状态一致 + 输入序列一致 + 逻辑确定，那么最终状态一定一致。棋谱表示法也是一样，只要初始棋盘状态一致 + 棋谱记录一致 + 棋子移动规则确定，那么最终棋局状态一定一致。&lt;/p>
&lt;p>帧同步和棋谱的不同点。一般帧同步游戏，以 ticker 为单位，每一帧的时间长度是固定的，客户端需要在每一帧内收集玩家的操作输入，并在帧结束时统一计算游戏状态。而棋谱表示法没有固定的时间长度，在这个对比中，棋谱表示法可以把每次走子的操作看作一帧，棋谱记录的是每一帧的操作输入，而不是整个棋盘的状态。棋谱表示法没有固定的时间长度，每一步棋的操作输入都是独立的，而帧同步游戏中，每一帧的时间长度是固定的，客户端需要在每一帧内收集玩家的操作输入，并在帧结束时统一计算游戏状态。&lt;/p>
&lt;p>象棋棋谱可以看作帧同步思想的一个极简版本，但缺少实时性、预测和回滚这些复杂部分。它们最大的共同基础就是：只要初始状态一致 + 输入序列一致 + 逻辑确定，那么最终状态一定一致。&lt;/p>
&lt;h2 id="总结">&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor">&lt;/a>总结
&lt;/h2>&lt;p>帧同步和棋谱表示法都强调输入驱动的状态还原，通过记录每一步的操作输入，玩家或客户端可以还原出当前的状态。帧同步游戏在实时性、预测和回滚方面比棋谱表示法更复杂，但核心思想是一致的：只要初始状态一致 + 输入序列一致 + 逻辑确定，那么最终状态一定一致。&lt;/p>
&lt;p>虽然做游戏好多年了，之前做的游戏基本都是状态同步类型的，现在我刚开始接触帧同步的玩法，很多地方了解的还不够深入，比如预测和回滚机制，断线重连的处理等。写这篇文章的原因主要是这几天看到了棋谱的表示法，突然联想到帧同步的机制，觉得很有意思，就想写下来分享一下我的一些理解。&lt;/p></description></item></channel></rss>