《Cocos 游戏联机实战》9.3 延迟补偿与体验权衡
公平与手感之间的取舍。本节讲延迟补偿的常见做法与服务端回滚判定所需的客户端配合,把「双人竞速各跑各的」讲透——纯计时不需要补偿,只有碰撞干扰才需要,并给出带死区与上限的 L1 补偿决策函数、配套单测,以及一张把零补偿到无上限动态补偿逐项对比的公平与手感权衡表。
category
公平与手感之间的取舍。本节讲延迟补偿的常见做法与服务端回滚判定所需的客户端配合,把「双人竞速各跑各的」讲透——纯计时不需要补偿,只有碰撞干扰才需要,并给出带死区与上限的 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% 丢包下双方仍收敛到同一结果,并列出单帧耗时、内存与消息量的验收预算。
《Cocos 游戏联机实战》全书导航页:说明本卷只写客户端侧的定位与读者画像、前置知识、三条阅读路径与六周排期,交代《方块冲刺》在卷四里改成双人竞速后的工程设定、Transport 抽象与权威模型,划清「客户端实现」与「服务端接口约定」的边界,并按四个部分列出 10 章 29 节的完整章节索引与常见问题速查表,方便按需定位与跳读。
网络差的时候怎么还能玩?本节给出延迟、丢包、抖动三档分别触发什么的分级降级表,用滞回避免档位在阈值附近反复横跳,把阈值做成 const 配置对象便于按机型与地区调,并写一个可跑的网络质量评估器与降级决策器,配 vitest 断言「阈值附近不抖」「持续恶化逐级降级」。
第 4 章的预测与和解默认消息按序送达,可真实链路会丢包、重复、乱序。本节给出动态超时判定(基于 1.3 的 RTT 估计而非写死)、哪些消息可重传哪些必须丢、用序号信封加去重表实现幂等,并用超时重传器配 vitest 断言「重复消息只处理一次」「丢包下重传最终送达」。
第 4 章讲完预测与和解,前提一直是「链路还在」。本节处理链路断掉之后怎么回到同一局:给出客户端会话状态机(idle/connecting/connected/reconnecting/failed 用 const 对象表示)、重连握手要携带的会话令牌与快照序号、恢复点对齐的两种策略,并用假传输层写一个可跑的重连状态机与 vitest 断言。
远端玩家怎么动得平滑:讲清渲染延迟为什么故意把远端状态回放晚一个缓冲时间,对比插值(稳但有延迟)与外推(跟手但丢包会跳),交代快照缓冲与时间轴对齐、外推的衰减与上限,给出插值器与外推器的 L1 纯 TS 实现,并用 vitest 断言「抖动输入下输出连续」「丢包时外推不发散」。
收到服务端快照后客户端该怎么处理:对比直接接受、平滑插值与回滚重演三种做法,讲清回滚重演的完整流程与误差阈值如何避免「橡皮筋」,给出 reconciler 的 L1 纯 TS 实现与「丢包 30% 下预测位置仍收敛」「误差超阈值触发硬切」的 vitest 断言,并估算每帧重演的 CPU 代价。