这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《Cocos 游戏联机实战》6.2 房间生命周期
拿到 roomId 之后,客户端要跟住房间从创建到销毁的整条状态链。本节映射房间的等待中、准备中、进行中、结算中、已销毁五个状态到客户端状态机,处理玩家上下线与对手离开,讲清房间配置(赛道、规则、随机种子)为何必须由服务端下发,并用纯 TS 写出可单测的房间状态机与配置同步。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
拿到 roomId 之后,客户端要跟住房间从创建到销毁的整条状态链。本节映射房间的等待中、准备中、进行中、结算中、已销毁五个状态到客户端状态机,处理玩家上下线与对手离开,讲清房间配置(赛道、规则、随机种子)为何必须由服务端下发,并用纯 TS 写出可单测的房间状态机与配置同步。
匹配是联机第一关。服务端的匹配算法不在本书范围,本节只讲客户端在匹配里要做什么:拆开排队、已匹配待确认、确认中、已进入、取消这套客户端状态机,给出进队、匹配成功、确认、取消四条消息的字段与方向,用假传输层写出可单测的匹配客户端,并处理重复提交与确认超时两个真实坑。
全卷最后一节,只做客户端与服务端的接口交接:把连接鉴权、匹配、房间、对局、断线重连五类接口逐条写成字段表与端点约定,给出客户端可配置参数清单、跨端端点选择与四条联调冒烟用例,最后把客户端联机收成对齐世界、消除延迟感、扛住弱网、守住边界四件事并收尾全卷。
综合项目收官:把前九章的协议、会话、同步、预测与网络 UI 拼成可玩的双人竞速。给出逐条对应章节的客户端改造清单、ASCII 数据流总图与从登录到结算的完整时序,用假传输层加两个客户端实例写一局 L1 集成测试,断言在 200 ms 延迟与 5% 丢包下双方仍收敛到同一结果,并列出单帧耗时、内存与消息量的验收预算。
卷三《分布式与跨服》共 33 节,回答一个问题:一个单服能跑的 MMO 服务端,怎么变成一群机器上跑、彼此发现、跨服组队、跨服打仗、数据还能对得上的集群。含目录、三条阅读路径、可运行性口径与《晨曦大陆》跨服战场验收清单;全部代码在本机真跑,中间件以独立容器运行。
数据涨上来以后一台库装不下,按什么键分片决定了以后能不能平滑扩容。本节对比按 player_id 哈希与按 server_id 范围两种分片键,用一致性哈希把再均衡的搬迁量压到最低,讲清扩分片时的双写、校验、切读三步,并给出「4 分片扩到 8 分片后数据无丢失、路由正确」的真跑断言。
同一个角色的数据可能被两个写者同时改:定时快照在写,退出登录也在写,一份旧快照就能把刚发出去的奖励盖回去。本节讲清脏写的成因与三类防护——版本号乐观锁、定时快照加关键操作即时落库、脏标记批量合并,并给出「两个并发写只有一个成功、版本号递增」的真跑断言。
一个满级角色的数据散落在账号、等级、坐标、货币、背包、任务、属性七八个维度上,全塞进一张宽表会让每次位置更新都重写整行。本节讲清主表与扩展表的拆分原则:什么进热表、什么进冷表、大字段为什么必须分出去,并给出在 Postgres 上真跑的建表 DDL 与读写验证。
读写分离换来的读扩展能力,代价是主从复制延迟带来的「写后读旧」。本节用真跑的 Redis 复现「写后立即读可能读到旧值」,对照读主库、版本令牌、等待追上三种解法,并给出 CQRS 轻量版的完整实现:写侧落事件、读侧投影宽表,附本机实测数字与取舍。
冷启动、批量过期、热点活动都会把请求同时打到数据库上。本节用真跑的 Redis 给出四道防线:预热、单飞(singleflight)、逻辑过期、热点 key 探测,并给出「1000 并发请求同一个未缓存 key、源只被查 1 次」的可运行断言与实测数字。
缓存与数据库不一致是游戏服务端最常见的事故源。本节用真跑的 Redis 讲清三件事:缓存键怎么设计成命名空间加版本号、写库和删缓存到底谁先谁后、延迟双删怎么覆盖并发窗口;并给出并发读写下缓存与源最终一致的可运行断言、本机实测数字,以及失效风暴的三种摊平手段。
时钟回拨是雪花算法唯一的软肋。本节讲清它的三种成因(NTP 步进校时、虚拟机迁移、闰秒回拨)与三种应对(等待追平、换 worker id、抛错拒绝)各自的代价,并给出一个完整可跑、可注入假时钟的 L1 容错生成器与五条测试用例,让回拨从线上偶发变成可参数化的测试场景。
号段模式:用 Redis INCRBY 一次批发一批 ID,在内存里用双 buffer 预取慢慢发,把发号的远程调用摊薄到步长分之一。讲清主段与备用段切换的临界区、并发安全与跳号取舍,并在本机真连 Redis 跑出两个实例共用同一号段的互斥断言。
从零实现雪花算法:把 64 位切成符号位、41 位时间戳、10 位 worker id 与 12 位序列,讲清 worker id 如何由区服号合成、同毫秒序列耗尽怎么处理、为什么吞吐天花板由位布局而非核数决定,并给出本机实跑的并发吞吐与重复率 0 断言。
战场奖励到底算在哪个服?本节给出跨服结算的归属规则:战场只产出结算单,母服才是账本。用幂等键保证同一张单子重传多少次都只发一次奖,回传失败自动重试,最后用「战场产出总量等于各母服入账总量之和」的对账兜底,把丢单和重复入账都当场抓出来,并给出可直接运行的幂等与守恒断言。
跨服消息怎么找到人?频道广播靠「谁订阅了哪个频道」扇出,定向私聊则要先把玩家路由到它当前所在的服。本节用 NATS 真跑三个服:世界频道只到订阅它的服,定向消息精确投进目标服的收件箱,掉线期间的消息先暂存、换服上线后一次性补投,全程用独立 subject 前缀隔离。
玩家在 A 服报名,却要和 B、C 服的对手同场。本节从零写一个跨服中心:报名带服号与快照落到跨服队列,按战力分桶、蛇形分队完成撮合,结果再沿报名时那条长连接精确推回各自的母服。最后真起三个模拟服进程,断言通知回对了服,并给出并发写同一连接导致帧交错的真实踩坑与修法。
实例进程会崩,内存里的场景状态会随之消失。本节用快照 + 事件重放把状态重建出来:事件覆盖所有状态变更、快照带校验和、恢复时选最新可用快照再补放事件;并用 aegis 真跑「杀掉进程 → 重建 → 断言指纹一致」,最后讨论重建期间玩家怎么办。
上一节的调度器能起实例,但没有回答「起在哪台机器」。本节做分配 Broker:用 CPU、内存、连接数、实例槽位四个维度评估容量,选出余量最大的节点并立即预留,开不出来时进队列等待、超时返回明确错误;并给出 aegis 在本机的容量评估基准数字。
场景服、战斗服、世界服三类实例由同一个调度器管理:分配 ID、起进程、等到就绪、推进生命周期。本节把实例状态机(创建→就绪→分配→使用→回收)写成一张只有合法迁移的表,并用 aegis 真起一个实例进程、读到 READY 后再断言它确实在监听。