目录
卷一《网络与并发内核》把 aegis 的底座造了出来:帧怎么切、消息怎么路由、会话怎么管、定时器怎么组织、状态怎么同步、客户端说的话凭什么信。第 17 章把那些零件拼成了一个能登录、能移动、能广播的最小服务器。
但那个服务器里没有游戏。 玩家能走,不能打;能看见别人,不能组队;能连上,没有背包、没有任务、没有公会、没有排行榜。它是一条通畅的管道,管道里流的是心跳包和移动包,仅此而已。
卷二要做的,就是把玩法装进这条管道。
这一卷要解决什么
玩法系统的难,从来不在「写一个背包」这件事上。写一个背包,三天就能写完。难的是这几件事:
状态归谁。 玩家同时被场景服、战斗服、任务服务、背包服务看见,谁持有权威数据?谁只能读副本?一次战斗结算发了奖励,背包服务重放一遍会不会又发一次?这些问题的答案决定了后面几百个功能的写法,而它必须在写第一个功能之前定下来。
同一件事会被两处改。 玩家在副本里拾取一件装备、同时又在主城拍卖行卖掉同槽位的一件旧装备;组队进副本的瞬间队长掉线;公会仓库捐献和公会战报名的窗口重叠。这些不是边界情况,这是 MMO 的日常。
玩法要长在 Tick 上。 战斗、Buff、冷却、波次、世界事件都有时间维度,而时间维度必须和卷一定下来的世界时钟对齐,否则同一场战斗在不同服务器上跑出不同结果。
玩法会爆炸式增长。 今天做十个功能,明年做三百个。如果每个功能都自己写一套状态管理、一套并发保护、一套持久化,代码会在第 50 个功能时失控。
本卷的主线就是这四件事:先把分层与状态归属钉死,再把实体运行时和场景实例做出来,然后逐个实现玩法域,每一个域都遵循同一套「谁持有状态、怎么改状态、怎么结算、怎么审计」的模板。
这一卷写给谁
| 读者 | 现状 | 读完能拿到什么 |
|---|---|---|
| 读完卷一的读者 | 有了网络底座,但不知道玩法怎么接 | 一套可复制的玩法系统落地模板,54 节全部真跑 |
| 已在做游戏服务端 | 会写玩法,但代码随功能增长而失控 | 状态归属、并发保护、结算审计的统一口径 |
| 服务端转游戏的后端工程师 | 熟 CRUD 与事务,不熟 Tick 与实体运行时 | 从「请求-响应」到「实体-Tick-事件」的思维切换 |
| 独立开发者 / 小团队 | 想做出「能玩」的版本,被功能量吓住 | 一条按依赖排序的施工顺序:18 章就是 18 步 |
前置知识:读完卷一,或具备等价的长连接服务端经验;会写 Go。本卷不需要任何中间件——排行榜、缓存、队列全部用内存实现,你可以在一台笔记本上跑完全部代码。
四类读者,四种收获
如果你读完卷一。 你知道 Frame 长什么样、Seq 怎么用、幂等窗口怎么开。卷二让你第一次把这些机制用在真实玩法上:战斗结算的防重复发奖就是卷一幂等约定的第一次实战,AOI 广播就是卷一扇出机制的第一次实战,掉线迁移就是卷一会话表的第一次实战。卷一的每个抽象,卷二都会给你一个具体的用法。
如果你已经在做游戏服务端。 你大概率见过这样的代码:背包服务里有一把大锁,战斗服务里也有一把大锁,两边都在改同一个玩家的属性,出了问题只能靠日志猜。卷二第 1 章就把「状态归谁」讲透,后面每一章都在示范「一个域只拥有一份状态」是怎么落地的。读完你会知道那些锁该加在哪里、哪些锁其实根本不该存在。
如果你是后端转过来的。 你熟悉事务、熟悉乐观锁、熟悉「读-改-写」。游戏服务端的差别在于:状态长时间驻留内存、修改频率高到不能每次都落库、而且玩家能忍受的延迟是毫秒级。卷二会告诉你在这种约束下,一致性该怎么保证——不是靠数据库事务,而是靠单写者 + 事件溯源 + 幂等重放。
如果你是独立开发者。 你缺的是次序感。卷二 18 章就是一份施工顺序表:先定分层与状态归属,再做实体与场景,然后 AOI 与移动,接着战斗、掉落、背包、属性、任务,再往外是社交、公会、排行、邮件、交易、匹配,最后第 18 章把《晨曦大陆》装配成一个能玩的单服。每一章都能独立跑通。
这一卷与卷一的关系
卷二不重复卷一的任何内容,但大量复用卷一的定义。下表说明边界:
| 项 | 卷一负责 | 卷二负责 |
|---|---|---|
| 帧格式 | 定死 11 字节头与 length = 7 + N | 原样复用,不重新设计 |
| 命令号 | 0x00–0x03 五个模块 | 新增 0x04–0x0C 九个玩法模块 |
| 网络 I/O | Reactor、goroutine-per-connection、KCP | 不再涉及,默认底座可用 |
| 会话 | 会话表、顶号、重连票据 | 用会话表承载「玩家当前在哪个实例」 |
| 路由 | 路由表、请求-响应-推送、扇出 | 用扇出做 AOI 广播与聊天频道 |
| 定时器 | 时间轮、世界时钟、Tick 预算 | 用时间轮做技能冷却、Buff 到期、每日重置 |
| 幂等 | 幂等窗口、命令指纹、至少一次正确性 | 战斗结算、邮件领取、任务完成全部走这套 |
| 同步 | 状态同步 vs 帧同步、快照增量、预测校正 | 把同步用在真实实体上(AOI、移动、战斗) |
一句话:卷一告诉你消息怎么到,卷二告诉你消息到了之后改什么。
可运行性口径
本卷沿用卷一的分级,含义如下。
| 层级 | 含义 | 验收方式 |
|---|---|---|
| L1 | 纯逻辑,不依赖外部进程 | go test 直接跑绿 |
| L2 | 真起进程或真连端口 | 自写 harness 做端到端断言 |
| L2J | Java 对照实现 | 经 Docker 拉取的 JDK 21 真跑 |
| L3 | 仅静态(清单、配置) | 只做语法与结构校验,正文会说明 |
| L4 | 不可复现(公网、真机、DDoS) | 正文显式标注「需真实环境,命令行不可复现」 |
| B | 基准 | 产出数字,软告警不硬失败 |
本卷 54 节全部是 L1 或 B,只有第 4 章可能带一个 L2J 对照块。原因是玩法系统天然适合纯逻辑验证:AOI、匹配、掉落、属性计算、任务依赖图、排行榜,全部是可以在内存里跑出确定结果的东西。这意味着本卷的每一行代码,你都能在自己机器上原样跑出同样的结果。
基准三条纪律:进程隔离、预热到稳定、工作集超过缓存。所有数字都注明「同机相对量级,绝对数值不可移植」。
三条阅读路径
本卷 18 章 54 节,一次读完大约 5 周(每天一小时)。
路径 A:顺序通读(约 5 周)
最完整的一条。按顺序走完 18 章,每章的代码都亲手敲一遍。
第 1–3 章(分层、实体与场景)→ 第 4–6 章(AOI、移动与战斗)
→ 第 7–9 章(掉落、背包与属性)→ 第 10–12 章(任务、社交与组队)
→ 第 13–15 章(公会、排行与邮件)→ 第 16–18 章(交易、匹配与综合)
适合谁:想真正做出一款可玩的多人游戏、或准备自研服务端的读者。第 18 章会把前 17 章的玩法装进 aegis,不要跳过。
路径 B:直奔「能看见人」(约 2 周)
只想先让多个玩家同屏互相看见的话:
1.1 → 1.2 → 2.1 → 3.1 → 3.2 → 4.1 → 4.2 → 5.1 → 5.3 → 12.1 → 18.2
适合谁:想尽快做出一个「多人同屏」demo 的读者。这条路径跳过了所有资产与社交玩法,只走「实体 → 场景 → AOI → 移动 → 组队」这条最小可见链路。
路径 C:只关心经济与资产安全(约 2 周)
1.2 → 7.1 → 7.2 → 7.3 → 8.1 → 8.2 → 8.3 → 9.1 → 14.1 → 14.2 → 15.1 → 15.2 → 16.1 → 16.2 → 16.3
适合谁:被刷物品、重复发奖、拍卖行亏空、排行榜被刷这些问题折磨过的读者。
全书章节索引
第一部分:分层与运行时(第 1–3 章)
| 节 | 文章 |
|---|---|
| 1.1 | gateway / logic / scene / data 分层 |
| 1.2 | 状态归谁:防重复发奖与旧数据覆盖 |
| 1.3 | 本书范围与站内架构文章的分工 |
| 2.1 | entity runtime 与句柄 |
| 2.2 | 生命周期与对象池 |
| 2.3 | 运行时所有权与迁移 |
| 3.1 | 地图数据结构与逻辑坐标 |
| 3.2 | 实例创建与回收 |
| 3.3 | 分线、副本与主城/野外 |
第二部分:空间与战斗(第 4–6 章)
| 节 | 文章 |
|---|---|
| 4.1 | 九宫格 AOI 从零实现 |
| 4.2 | 十字链表 AOI 从零实现 |
| 4.3 | 基准:三种 AOI 的 CPU 与带宽对照 |
| 5.1 | 服务器权威移动 |
| 5.2 | A* 与导航网格 |
| 5.3 | 移动校验与防穿墙 |
| 6.1 | 指令投递与执行队列 |
| 6.2 | 技能与 Buff 建模 |
| 6.3 | 战斗结算与防重复发奖 |
第三部分:资产与成长(第 7–9 章)
| 节 | 文章 |
|---|---|
| 7.1 | 掉落表服务 |
| 7.2 | 确定性随机与随机种子 |
| 7.3 | 保底机制与掉落审计 |
| 8.1 | 物品与堆叠模型 |
| 8.2 | 并发修改与事务 |
| 8.3 | 装备与强化 |
| 9.1 | 属性计算与加成来源 |
| 9.2 | 等级与成长状态机 |
| 9.3 | 离线推进与体力 |
第四部分:任务与社交(第 10–12 章)
| 节 | 文章 |
|---|---|
| 10.1 | 任务依赖图与循环检测 |
| 10.2 | 事件上报与进度服务 |
| 10.3 | 每日重置与时区窗口 |
| 11.1 | 频道模型与权限 |
| 11.2 | 敏感词与限速治理 |
| 11.3 | 好友关系与关系一致性 |
| 12.1 | 队伍状态与入口控制 |
| 12.2 | 满员判断与匹配锁定 |
| 12.3 | 掉线处理与队长迁移 |
第五部分:组织与资产流转(第 13–15 章)
| 节 | 文章 |
|---|---|
| 13.1 | 入会、职位与权限 |
| 13.2 | 公会仓库与捐献流水 |
| 13.3 | 公会战报名与锁定 |
| 14.1 | 为什么不能只用一张表 |
| 14.2 | 写缓冲与分段榜单 |
| 14.3 | 结算与赛季边界 |
| 15.1 | 邮件投递与去重 |
| 15.2 | 附件、过期与流拍结算 |
| 15.3 | 红点聚合与离线同步 |
第六部分:交易、匹配与综合(第 16–18 章)
| 节 | 文章 |
|---|---|
| 16.1 | 资产冻结与托管 |
| 16.2 | 竞价并发与异常回滚 |
| 16.3 | 价格索引与经济风控 |
| 17.1 | 匹配算法与公平性 |
| 17.2 | 大厅生命周期:防幽灵房间 |
| 17.3 | 实例分配与回收 |
| 18.1 | 把玩法系统接进 aegis |
| 18.2 | 《晨曦大陆》单服可玩 |
| 18.3 | 单服承载数字 |
《晨曦大陆》单服可玩验收清单
第 18.2 节会给出可复现的验收脚本。验收标准是下面这条链路能端到端跑通并断言:
| # | 步骤 | 断言 |
|---|---|---|
| 1 | 登录 | 三个机器人客户端拿到角色与票据 |
| 2 | 进世界 | 三个角色出现在同一场景实例,属性同步正确 |
| 3 | 移动 | 移动后 AOI 邻居收到 CmdAoiAdd / CmdMoveResp |
| 4 | 打怪 | 技能命中,伤害结算,怪物死亡 |
| 5 | 掉落 | 掉落表按种子产出确定结果,背包里出现对应物品 |
| 6 | 拾取入包 | 堆叠合并正确,背包变更同步给客户端 |
| 7 | 交任务 | 击杀事件推进任务进度,任务完成并发奖 |
| 8 | 组队 | 三人组队成功,队长迁移在掉线时生效 |
| 9 | 进副本 | 队伍匹配到实例,队伍整体迁移进副本 |
| 10 | 结算 | 副本结算发奖一次且仅一次(重放不重复发) |
十步全绿,卷二验收通过。
每一节长什么样
本卷 54 节正文的结构是固定的,熟悉之后你可以快速定位自己想要的部分。
开头一段:这一节解决什么问题。 每节第一段会用一个具体场景切入,比如「玩家在副本里拾取装备的同时在拍卖行卖掉同槽位装备」。它不铺垫,直接告诉你为什么需要这一节的东西。
主体:从零写代码。 每一节都有至少一块带 // file: 与 // verify: 的完整代码。代码不是片段,是能 go test 跑绿的真实文件。
数字与取舍:结论由实测支撑。 涉及性能的节会给出本机实测的数字,并说明这个结论的适用边界和它的代价。本卷不会出现「快 N 倍」这类不可复现的绝对断言。
末尾:阅读导航。 每节最后一行是「上一节 / 下一节」链接。每章第 1 节的「上一节」指向本目录页,末节的「下一节」指向下一章第 1 节。你可以完全靠这一行顺序读下去。
每章第 1 节另有一张分工表。 它说明本章和站内既有 practice 架构文章的分工——哪些问题该去看那些文章(架构方案与取舍),哪些问题由本章从零解决(实现与真跑)。这张表是为了避免你重复读两遍同样的内容。
学完之后你能做什么
读完卷二,你应该具备这些能力,它们也是本卷的验收标准:
- 能对一个新玩法说出「状态归谁」。 拿到「限时活动」这类需求,你能先画出状态持有者与读副本,而不是直接开始写接口。
- 能写出并发安全的背包与资产服务。 知道哪些操作用单写者串行化、哪些用 CAS、哪些必须冻结托管。
- 能把玩法长在 Tick 上。 技能冷却、Buff 到期、波次推进、每日重置,全部对齐到同一个世界时钟。
- 能做出一个多人同屏的最小可玩版本。 登录、移动、AOI、战斗、掉落、任务、组队、副本,一条链路打通。
- 能判断一个排行榜/匹配/交易设计会不会在规模上塌掉。 知道什么时候该分桶、什么时候该分段、什么时候该引入外部存储。
学不到:分布式与跨服(卷三)、运维部署与数据分析(卷四)、客户端表现与美术管线(不在本系列范围)。
常见问题速查
| 你遇到的问题 | 看哪一节 |
|---|---|
| 同一份数据被两个服务改,互相覆盖 | 1.2 |
| 战斗结算重放,奖励发了两次 | 6.3 |
| 实体对象分配太频繁,GC 压力大 | 2.2 |
| 副本打完了实例不回收,内存一直涨 | 3.2 |
| 同屏人数一多,CPU 全耗在算邻居上 | 4.1 · 4.2 |
| 不知道九宫格和十字链表该选哪个 | 4.3 |
| 玩家开加速外挂瞬移 | 5.3 |
| 掉落结果无法复现,客服没法查 | 7.2 |
| 背包并发修改出现物品凭空消失 | 8.2 |
| 属性加成叠加顺序算错,战力对不上 | 9.1 |
| 每日重置在不同时区玩家那里时间不一致 | 10.3 |
| 世界频道被刷屏 | 11.2 |
| 队长掉线,队伍散了 | 12.3 |
| 公会仓库物品对不上账 | 13.2 |
| 排行榜每次查询都全表排序 | 14.1 · 14.2 |
| 邮件附件过期了,玩家说没收到 | 15.2 |
| 拍卖行出现负资产 / 刷金 | 16.1 · 16.3 |
| 匹配等太久,或匹配到的对手差太多 | 17.1 |
| 房间没人了还挂在内存里 | 17.2 |
怎么用这份索引
- 想系统学:走路径 A,从第 1 章 1.1 开始。
- 想抓重点:走路径 B,从第 1 章 1.1 读两节后直接跳到第 4 章 4.1 。
- 想查问题:直接用上面的「常见问题速查」,或跳到对应小节。
- 想配代码:每一节的代码块都标了层级与来源文件,L1 的可以直接复制出来在 Go 1.26 上跑。
- 每篇正文末行都有「上一节 / 下一节」导航,也可以随时回到本页。
相关阅读
- 卷一《网络与并发内核》 :协议、KCP、会话、路由、定时器、Actor、同步模型与安全底座
- 游戏服务端专题 :网络模型、同步方案与分布式架构
- 游戏服务端实战专题导航 :170 篇架构设计与取舍
- 游戏引擎实现原理 :从零写一个 3D 引擎的四卷本
- 书稿书架 :全部电子书与创作手记
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。