这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《Cocos 游戏联机实战》9.3 延迟补偿与体验权衡
公平与手感之间的取舍。本节讲延迟补偿的常见做法与服务端回滚判定所需的客户端配合,把「双人竞速各跑各的」讲透——纯计时不需要补偿,只有碰撞干扰才需要,并给出带死区与上限的 L1 补偿决策函数、配套单测,以及一张把零补偿到无上限动态补偿逐项对比的公平与手感权衡表。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
公平与手感之间的取舍。本节讲延迟补偿的常见做法与服务端回滚判定所需的客户端配合,把「双人竞速各跑各的」讲透——纯计时不需要补偿,只有碰撞干扰才需要,并给出带死区与上限的 L1 补偿决策函数、配套单测,以及一张把零补偿到无上限动态补偿逐项对比的公平与手感权衡表。
延迟、掉线、重连该怎么告诉玩家,以及哪些网络数据不该给玩家看。本节给出网络质量档位到图标与文案的映射表、提示的时机与频率控制、无障碍与本地化考虑,并落到一个订阅会话状态与诊断数据的 L2 UI 组件,以及一个可单测、覆盖多档位边界的 L1 档位映射函数。
前几章把插值与预测写成了可测的纯逻辑,本节把它接到 Cocos 节点与帧循环:讲清逻辑 60 Hz 定点与渲染浮动帧率的分工,远端玩家如何用插值位置驱动 setPosition、用插值速度切换动画,为什么特效必须由服务端事件触发而非状态推断,并给出 L1 纯函数插值器与 L2 组件脚本。
客户端侧的加密配合与它的边界:wss 传输层加密在 H5、微信小游戏、原生三端的支持情况与证书要求,消息校验和与 HMAC 能防网络中间人篡改、却防不了本地改客户端,客户端该做与不该做的一整张职责清单,最后回到「真正的裁决在服务端」这条底线。
客户端不可信,所以这一节校验的是服务端下发的快照:字段范围、时序合理性、序号连续性、与本地预测的偏差四类检查,配上接受、平滑修正、丢弃、上报四种处理策略,并明确客户端校验只保可用性与健壮性、不阻止作弊,最后给出可跑的快照校验器、假传输层与 vitest 单测。
把《方块冲刺》的每个游戏事实逐一归类到权威方:位置、速度、输入、计时、得分、掉落、胜负各自归谁管、客户端被改会怎样,给出「客户端只发意图、不发结果」的原则,讲清客户端预测为什么不是客户端权威,再用一张权威边界表与可跑的单测把边界钉进协议与代码。
线上卡顿与不同步不能靠猜。本节先给出一张从症状到原因的排查表(橡皮筋、远端瞬移、逐渐漂移、周期性卡、特定网络必现),再说明客户端该落哪些日志、怎么采样控制体积,并用纯 TS 写出固定容量的环形日志缓冲与按帧号关联输入和快照的追踪,最后把线上抓到的网络序列喂回 7.1 的模拟器复现。
机器人压测不是拿真玩家去撞服务端,而是把客户端逻辑层抽出来,在 Node 里同时驱动成百上千个无渲染的机器人,用它们压自己这套模拟与消息处理。本节给出机器人客户端与脚本化行为的纯 TS 实现、只回最小快照的假服务端测试替身、用 vitest 断言规模下的单帧耗时预算,并说明压测结论该怎么写才可信。
本地复现线上卡顿的前提,是能造出一模一样的弱网。本节把弱网拆成延迟、抖动、丢包、乱序、带宽与突发中断六种病,给出一个可配置、可脚本化的弱网 Transport 装饰器,用固定随机种子保证可复现,并用 vitest 断言丢包率与延迟分布落在设定区间,最后列出诊断面板该采集的指标。
观战与回放都不产生输入,只把同一场比赛在本地重演。本节对比观战与参战的数据流差异,讲观战为何只需要插值、不需要预测,说明回放该录输入流与随机种子而非状态,用纯 TS 写出可单测的回放器(记录加重演、关键帧快照支持拖动进度),并估算一局录像的体积。
拿到 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 次」的可运行断言与实测数字。