目录
欢迎来到《Cocos 游戏联机实战》。前三卷把单机做透了:卷一从零手写 mini2d 看懂引擎怎么工作,卷二用 Cocos Creator 3.8 把《方块冲刺》做成能发布到 H5 / 微信小游戏 / 原生的产品,卷三回过头把引擎本身当研究对象。这一卷给同一个游戏加联机——把它改成双人竞速。
本卷只写客户端侧。 这句话不是省略,而是本卷的定位:站内 game/server/ 已有 315 篇服务端文章,书稿《游戏服务端编程实践》另有 43 篇,服务端实现(网关、AOI 服务、匹配服务、战斗裁决)那里已经讲透,本卷一律不重复。凡涉及服务端,只给消息格式与接口约定——「客户端发什么、服务端回什么」,至于服务端怎么实现,交接给那两处。
那客户端侧还剩什么?剩下的是联机里最难、也最考验工程判断的部分:确定性模拟、快照 diff、插值与外推、预测与回滚、时钟同步、协议编解码、弱网降级、重连状态机、客户端权威边界。这些全在客户端,也全都能写成可跑的代码。
本页给出全书的阅读路线。你可以从第 1 章 1.1 开始顺序通读,也可以先看下面的三条路径,挑一条最合你胃口的走法。
这一卷写给谁
| 读者 | 现状 | 读完能拿到什么 |
|---|---|---|
| 读完前三卷、想把游戏做成联机的开发者 | 单机很熟,联机只有模糊概念 | 一套客户端侧的完整联机能力:同步、预测、和解、重连 |
| 有服务端背景、转做客户端联机 | 懂协议与后端,不懂客户端为什么要预测 | 客户端为什么要回滚重演,以及怎么把预测写成可测的纯逻辑 |
| 被弱网问题折磨过的开发者 | 知道线上卡,但不知道卡在哪一环 | 弱网模拟、诊断与降级的完整方法 |
| 想评估联机可行性的技术负责人 | 不确定联机要多少工作量、多少带宽 | 带宽预算、同步方式的取舍与客户端改造清单 |
前置知识:读完卷一与卷二,或已具备等价基础(看得懂 TypeScript 组件脚本、走过一次完整发布流程)。卷三不是必需——本卷只在需要时才引用卷三的内部机制结论。建议本机安装 Cocos Creator 3.8——本卷有少量工程配置与房间配置片段,命令行无法复现;但占本卷主体的 L1 纯逻辑与 L2 组件脚本都能独立验证。
本卷与前三卷的分工
四卷本里,卷四是最独立的一卷:前三卷都在回答「引擎怎么用」,卷四回答「两个客户端怎么对上」。四卷各回答一个问题:
| 卷 | 回答的问题 | 主要战场 | 交付物 |
|---|---|---|---|
| 卷一《入门》 | 引擎里的每件事怎么工作? | 手写 mini2d,从零实现帧循环、渲染、物理、存档 | 一个能跑、能测、能截图的 2D 运行时骨架 |
| 卷二《实战》 | 怎么用引擎做出并发布一个产品? | Cocos Creator 编辑器与工程体系 | 一个发布到 H5 / 微信 / 原生的《方块冲刺》 |
| 卷三《高级编程》 | 引擎为什么这么设计、问题往哪里挖? | 引擎内部机制、源码与定制 | 一套能定位瓶颈、能改引擎、能评估升级的分析能力 |
| 卷四《联机实战》 | 两个客户端怎么对齐同一份世界? | 客户端侧同步、预测与容错 | 一个双人竞速的《方块冲刺》与一套可测的联机框架 |
所以卷四不重做游戏,也不重做引擎。 它把卷二那个产品当素材,加一层网络:帧循环沿用卷一 4.2 的固定步长累积器,工程设定沿用卷二那套,区别只在于——前三卷的世界里只有一个玩家,卷四的世界里有两个,而这两个人隔着网络、时钟不同步、还会丢包。
如果你只读过卷一,卷四照样能读:第 1 章的网络分层与第 2 章的确定性模拟都不依赖卷二的具体工程细节。但第 9–10 章的表现与综合项目会频繁引用卷二的产品形态,建议至少先扫一遍卷二的目录页 。
动手前的环境准备
本卷的验证分三层(详见下面的「可验证口径」),环境要求按层不同:
| 要做的事 | 需要装什么 | 说明 |
|---|---|---|
| 真跑 L1 纯逻辑 | Node 26 + vitest | 确定性模拟、快照 diff、预测和解、编解码都能独立单测 |
| 类型检查 L2 组件脚本 | Node 26 + @cocos/creator-types@3.8.8 + TypeScript | 不需要编辑器,tsc --noEmit 即可 |
| 打开 L3 工程配置 | Cocos Creator 3.8.8 编辑器 | 房间配置、网络相关工程设置必须在编辑器里查看 |
| 对接服务端 | 一个可连的 WebSocket 端点 | 本卷只给约定;没有真实服务端时用假传输层单测即可 |
没有编辑器、没有服务端也能读全部内容。 本卷主体是 L1:网络逻辑与引擎无关,用假传输层 + 假时钟就能在 Node 里完整验证。这也是本卷刻意设计的——联机逻辑必须先能脱离网络单独测试,才谈得上可靠。
三条阅读路径
路径 A:完整通读(约 6 周)
最完整的一条。从网络分层讲到双人竞速综合项目,每章都在回答「客户端该做什么」。
第 1–4 章(基础、帧同步、状态同步、预测和解)→ 第 5–6 章(重连、匹配与房间)
→ 第 7–8 章(调试压测、反作弊与安全)→ 第 9–10 章(表现与综合项目)
适合要把联机一次做对的读者。第 4 章(客户端预测与和解)是全卷的枢纽,前三章讲清「世界怎么对齐」,第 4 章讲「对齐之前客户端先怎么动」。
路径 B:按主题跳读(约 3 周)
已经有明确目标的话,按下面的分组跳读:
同步方向:1 → 2 → 3 → 4
容错方向:5 → 6
工程方向:7 → 8
表现方向:9 → 10
每组内部是递进的,组之间可以独立看。同步方向建议从第 1 章读起——不先理解权威边界与协议选型,后面看预测与和解容易云里雾里。
路径 C:按问题查(随时)
不打算通读,只在遇到具体问题时翻对应章节。下节「常见问题速查」就是为这条路准备的。
贯穿项目:《方块冲刺》(联机形态)
卷四沿用卷二、卷三那套工程设定,不得前后矛盾:工程名 block-dash、包名 com.example.blockdash、设计分辨率 960 × 540(fitHeight + SHOW_ALL)、目标平台 H5 / 微信小游戏 / 原生、分包 bundle-levels、存档键 blockdash.save.v1。
卷四在这套设定上加联机,新增的固定项为:
| 项 | 卷四里的取值 |
|---|---|
| 联机形态 | 双人竞速——同一条跑道上比谁先到终点,可互相轻微干扰 |
| 引擎版本 | Cocos Creator 3.8.8(全书锁定) |
| 客户端逻辑层 | 新增 assets/scripts/net/:protocol/(消息定义与编解码)、sync/(快照与插值)、predict/(预测与和解)、session/(连接与重连) |
| 传输层 | WebSocket(H5 / 微信小游戏 / 原生均支持);抽象成 Transport 接口,便于用假实现单测 |
| 权威模型 | 服务端权威 + 客户端预测——客户端模拟输入并预测,收到服务端快照后和解 |
| 同步方式 | 状态同步(快照 + 增量);第 2 章的帧同步作为对照方案 |
| 固定步长 | 沿用卷一 4.2 的固定步长累积器(60 Hz 逻辑帧) |
| 确定性 | 定点数(整数运算)保证跨端一致;浮点只用于表现层 |
| 服务端约定 | 只给消息格式与接口约定;实现不写,对接既有服务端书稿 |
全书共用这一套设定,不得前后矛盾。 尤其要守住两个口径:传输层必须抽象成 Transport 接口(否则代码没法单测),权威在服务端(客户端的预测只是「先动一下」,不是「说了算」)。
可验证口径(本卷的核心设计)
联机代码最容易写成一堆「看起来对但跑不起来」的时序图。本卷的应对是:把能脱离网络的逻辑全部抽成 L1,用假传输层 + 假时钟真跑单测。
| 层 | 卷四里的内容 | 能否验证 | 怎么验证 |
|---|---|---|---|
| L1 | 纯逻辑(确定性模拟、定点数、快照 diff、插值外推、预测与回滚、编解码、时钟同步) | 能真跑 | Node + vitest 单测,注入假传输层与假时钟 |
| L2 | Cocos 组件脚本(import { X } from 'cc',把 L1 逻辑接进节点与帧循环) | 能真做类型检查 | tsc --noEmit 对 @cocos/creator-types@3.8.8 检查 |
| L3 | 工程与房间配置(settings/*.json、房间参数) | 不能命令行复现 | 结构校验;正文每处都显式标注「需 Cocos Creator 3.8 编辑器打开」 |
| 接口约定 | 服务端消息格式与端点约定 | 可对接 | 用字段表与 JSON 描述方向与类型;不贴服务端实现代码 |
这意味着什么? 本卷的每一段网络逻辑,都至少有一层可验证性:能写成纯逻辑的就写成纯逻辑并配单测,能写成组件脚本的就过类型检查,只有工程配置与房间配置才落到「需编辑器」这一档。凡是「服务端如何裁决」的话题,本卷只写约定,明确交接给站内服务端专题与书稿。
版本与技术口径
| 项 | 版本 | 说明 |
|---|---|---|
| Cocos Creator | 3.8.8 | 全书锁定,对应 @cocos/creator-types@3.8.8 |
| 传输协议 | WebSocket | H5 / 微信小游戏 / 原生均支持;抽象为 Transport |
| Node.js | 26.5.0 | 只做 TypeScript 类型剥离,因此脚本限可擦除语法 |
| TypeScript | 7.0.2 | 组件脚本与逻辑层使用;禁 enum / namespace / 构造函数参数属性 |
| 测试 | vitest | L1 逻辑单测;假传输层注入延迟、丢包与乱序 |
关于「可擦除语法」:Cocos 的脚本编译链只剥离类型,所以 enum、namespace、构造函数参数属性这类「需要生成运行时代码」的写法不要用。本书一律用 const 对象 + as const 代替 enum——这一点在联机代码里尤其重要,因为协议常量与消息类型定义最容易顺手写成 enum。
全书结构
全书 10 章分四个部分,前 9 章每章 3 节、第 10 章 2 节,共 29 节。此外有 1 篇目录(本页)。序与前言见卷一。
第一部分:同步基础(第 1–4 章)
先建立正确的联机心智模型,再依次看两条同步路线与客户端预测。
| 节 | 标题 | 一句话 |
|---|---|---|
| 1.1 | 网络分层、拓扑与权威边界 | 谁是权威、客户端能决定什么 |
| 1.2 | 协议选型与序列化 | 二进制还是 JSON,怎么编解码 |
| 1.3 | 时钟、延迟与抖动 | 两端时钟怎么对齐,RTT 怎么测 |
| 2.1 | 确定性模拟与定点数 | 让两端算出同一结果 |
| 2.2 | 输入广播与帧对齐 | 帧同步的输入怎么收集与推进 |
| 2.3 | 回滚与追帧 | 迟到的输入怎么补,怎么追帧 |
| 3.1 | 快照与增量同步 | 状态同步怎么算差异、怎么传 |
| 3.2 | 兴趣管理与 AOI | 只同步你看得见的东西 |
| 3.3 | 带宽预算与压缩 | 每人每秒多少 KB,怎么压 |
| 4.1 | 本地预测 | 客户端为什么能先动 |
| 4.2 | 服务器和解与重演 | 收到快照后怎么比对与回滚 |
| 4.3 | 插值与外推 | 远端玩家怎么动得平滑 |
第二部分:容错与房间(第 5–6 章)
联机不是理想网络。这一部分处理断线、超时与匹配房间。
| 节 | 标题 | 一句话 |
|---|---|---|
| 5.1 | 重连流程与状态恢复 | 掉线之后怎么回到同一局 |
| 5.2 | 超时、重传与幂等 | 消息丢了怎么办,重复了怎么办 |
| 5.3 | 弱网降级策略 | 网络差的时候怎么还能玩 |
| 6.1 | 匹配流程与客户端角色 | 匹配里客户端要做什么 |
| 6.2 | 房间生命周期 | 房间从创建到销毁的客户端状态机 |
| 6.3 | 观战与回放 | 旁观与录像的客户端实现 |
第三部分:调试与安全(第 7–8 章)
把联机问题变成可复现、可定位、可防御的工程问题。
| 节 | 标题 | 一句话 |
|---|---|---|
| 7.1 | 弱网模拟与网络诊断 | 在本地造出真实弱网 |
| 7.2 | 机器人压测 | 用机器人客户端压自己 |
| 7.3 | 线上问题定位 | 线上卡顿与不同步怎么查 |
| 8.1 | 客户端权威边界 | 客户端能信什么、不能信什么 |
| 8.2 | 关键数据校验 | 校验服务端下发的状态 |
| 8.3 | 通信加密与防篡改 | 客户端侧的配合与边界 |
第四部分:表现与收官(第 9–10 章)
把同步做进画面,再合成一个完整的双人竞速。
| 节 | 标题 | 一句话 |
|---|---|---|
| 9.1 | 同步表现与插值动画 | 同步数据怎么驱动动画与特效 |
| 9.2 | 网络状态 UI 与提示 | 延迟、掉线、重连怎么告知玩家 |
| 9.3 | 延迟补偿与体验权衡 | 公平与手感的取舍 |
| 10.1 | 把《方块冲刺》做成双人竞速 | 综合项目:把前九章拼起来 |
| 10.2 | 与既有服务端书稿的对接约定 | 客户端与服务端的接口交接 |
六周学习计划
按路径 A 走,一个参考排期:
| 周次 | 章节 | 产出 |
|---|---|---|
| 第 1 周 | 第 1 章 | 建立权威边界与协议、时钟的正确心智模型 |
| 第 2 周 | 第 2–3 章 | 理解帧同步与状态同步两条路线及各自代价 |
| 第 3 周 | 第 4 章 | 写出可测的客户端预测与和解 |
| 第 4 周 | 第 5–6 章 | 重连、超时与房间状态机落地 |
| 第 5 周 | 第 7–8 章 | 弱网模拟、压测与客户端安全边界 |
| 第 6 周 | 第 9–10 章 | 联机表现与双人竞速综合项目 |
常见问题速查
| 你遇到的问题 | 去看 |
|---|---|
| 不知道该把哪些逻辑放服务端 | 1.1 网络分层、拓扑与权威边界 |
| 协议选型拿不定主意 | 1.2 协议选型与序列化 |
| RTT 测不准、时钟对不上 | 1.3 时钟、延迟与抖动 |
| 两端算出不同结果 | 2.1 确定性模拟与定点数 |
| 想改用帧同步 | 2.2 输入广播与帧对齐 |
| 状态同步带宽太高 | 3.3 带宽预算与压缩 |
| 自己的角色操作有延迟感 | 4.1 本地预测 |
| 预测之后位置对不上 | 4.2 服务器和解与重演 |
| 远端玩家一卡一卡 | 4.3 插值与外推 |
| 掉线之后回不到局内 | 5.1 重连流程与状态恢复 |
| 消息重复处理出问题 | 5.2 超时、重传与幂等 |
| 弱网下体验崩了 | 5.3 弱网降级策略 |
| 本地复现不出线上卡顿 | 7.1 弱网模拟与网络诊断 |
| 想知道客户端能不能被改数据 | 8.1 客户端权威边界 |
| 同步数据怎么驱动动画 | 9.1 同步表现与插值动画 |
| 怎么把延迟告诉玩家 | 9.2 网络状态 UI 与提示 |
| 要做完整联机但不知从哪拼 | 10.1 把《方块冲刺》做成双人竞速 |
学完之后你能做什么
走完全书,你应该具备这几项能力——它们也是本卷隐含的验收标准:
- 说得清权威边界:拿到一个联机需求,能立刻判断哪些逻辑必须在服务端、哪些可以放客户端。
- 写得出可测的同步逻辑:确定性模拟、快照 diff、预测与和解都能脱离网络单测,而不是只能联调时碰运气。
- 处理得了弱网:知道丢包、延迟、抖动分别会破坏什么,以及各自该用什么策略兜住。
- 做得出联机表现:能把同步数据变成平滑的插值动画与清晰的网络状态提示,而不是把技术指标直接甩给玩家。
- 守得住安全底线:清楚客户端永远不可信,知道客户端侧能做什么、以及为什么真正的裁决必须在服务端。
这些能力无法只靠读获得,本卷的每一节都尽量给出可跑的 L1 代码与单测,方便你边读边试。
相关阅读
- 游戏服务端编程实践 — 服务端实现的书稿,本卷的服务端约定与它对接
- 游戏开发专题 — 站内游戏开发的专题文章总入口
- 游戏服务端专题 — 网关、AOI、匹配与战斗裁决的服务端讨论
- TypeScript 专题 — 类型系统与工程实践
- 书稿专题 — 全部在线电子书与创作手记
准备好了就翻开第 1 章 1.1 网络分层、拓扑与权威边界 开始。若还没读卷二,建议先看《Cocos 游戏开发实战》目录 。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。