《MMO 服务器开发》单服架构与玩法系统 目录

《MMO 服务器开发》卷二《单服架构与玩法系统》全书导航页:说明本卷在四卷本中的位置与承接关系,交代读者画像、前置知识与三条阅读路径,讲清分层与状态归属这一条贯穿全卷的主线,并按六个部分列出 18 章 54 节的完整章节索引,另含《晨曦大陆》单服可玩的验收清单与常见问题速查表,方便读者按需定位与随时查阅。

目录

卷一《网络与并发内核》把 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/OReactor、goroutine-per-connection、KCP不再涉及,默认底座可用
会话会话表、顶号、重连票据用会话表承载「玩家当前在哪个实例」
路由路由表、请求-响应-推送、扇出用扇出做 AOI 广播与聊天频道
定时器时间轮、世界时钟、Tick 预算用时间轮做技能冷却、Buff 到期、每日重置
幂等幂等窗口、命令指纹、至少一次正确性战斗结算、邮件领取、任务完成全部走这套
同步状态同步 vs 帧同步、快照增量、预测校正把同步用在真实实体上(AOI、移动、战斗)

一句话:卷一告诉你消息怎么到,卷二告诉你消息到了之后改什么。

可运行性口径

本卷沿用卷一的分级,含义如下。

层级含义验收方式
L1纯逻辑,不依赖外部进程go test 直接跑绿
L2真起进程或真连端口自写 harness 做端到端断言
L2JJava 对照实现经 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.1gateway / logic / scene / data 分层
1.2状态归谁:防重复发奖与旧数据覆盖
1.3本书范围与站内架构文章的分工
2.1entity 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.2A* 与导航网格
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 上跑。
  • 每篇正文末行都有「上一节 / 下一节」导航,也可以随时回到本页。

相关阅读

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「mmo」更多文章

  1. 《MMO 服务器开发》工程化与运营 · 目录
  2. 《MMO 服务器开发》9.3 上线检查清单
  3. 《MMO 服务器开发》9.2 性能预算达标