第 16 章是《在线联机原型全集》从「小游戏同步」跨向「实时对战工程」的分水岭。它用一张单兵线小地图把问题域压缩到最小,却要求读者同时解决三件事:服务器如何在 20Hz 的固定节拍上做权威裁决、AI 兵线/防御塔如何在没有共享随机源的前提下确定性推进、以及玩家掉线十秒后如何凭关键帧加事件日志把整场战斗「秒回」。如果你此前只做过请求-响应式的房间玩法,这一章就是实时服务端的第一课。
本章定位
- 全集位置:第 16 章,属「实时对战进阶」层的开篇,前接第 15 章微型赛车系统的回滚与插值经验,后启第 17 章战棋对战的战术锁步。
- 难度梯度:进阶偏上。既要求读者理解帧同步(第 6 章)、房间与网关骨架(第 7 章),也要接受「确定性」这一贯穿全集的硬约束。
- 前置章节:第 6 章 Pong 对战(实时 60 FPS 原型的时序基础)、第 7 章贪吃蛇大作战(实时房间与网关基线)、第 14 章房间逃脱(事件溯源与快照思路)、第 15 章微型赛车系统(回滚与插值复用)。
- 后续衔接:第 17 章将把「实时帧」替换为「回合步」,把「输入」抽象为「命令」,但确定性与回放的内核一脉相承。
核心验证目标
- 服务器权威 Tick 同步:服务端固定 20Hz(50ms/帧),客户端渲染 60fps;所有伤害、击杀、硬控以服务端回传为准,客户端只对自身移动做轻预测。
- 三段帧结构:输入帧
{uid, tick, move_vec, cast_cmd?, target?}、状态帧{tick, changed_entities[], acks[], rng_mark, hash}、每 1–2 秒落盘的关键帧快照。 - 确定性 AI 单位:兵线每 20 秒刷一波顺路推进,防御塔按仇恨锁定最近目标,野怪提供临时增益;随机数统一来自服务器种子,帧内迭代顺序固定,避免浮点不可重现差异。
- 客户端时序与微校正:渲染滞后服务端 2–3 Tick 以吸收抖动;自身移动本地立即推进,权威帧到达后对 0.2m 以内偏差做 Lerp 平滑校正;他人与 AI 仅插值/外推,外推长度不超过 2 帧。
- 断线重连与恢复:客户端携带
room_id与last_acked_tick重连,服务器选择不大于该 Tick 的最近关键帧回放,配合事件日志补齐,目标 10 秒内恢复战斗画面并可通过哈希校验。 - 事件流可重放:服务器每个 Tick 追加事件日志,关键帧与增量事件共同构成可回放的完整战斗轨迹,为反作弊与观战打基础。
技术栈建议
| 层次 | 推荐选型 | 说明 |
|---|---|---|
| 服务端 | Go 优先,Java 备选 | 承载 Tick 循环、AI 推进与伤害结算 |
| 客户端 | TypeScript(WebGL 或 Unity WebGL) | 负责轻预测、插值与 UI 动画 |
| AI 与导航 | C 或 Rust 扩展 | 寻路与感知计算密集时下沉 |
| 协议 | WebSocket(可靠通道)加 UDP(可选) | UDP 用于玩家输入与位置增量 |
| 时钟 | 20Hz 服务端 Tick,60fps 客户端渲染 | 建议 50ms 一帧 |
本章文章
| 文章 | 核心内容 |
|---|---|
| 在线联机原型全集:第 16 章 简版 MOBA(Battle + AI Units|Tick Sync, Reconnect & Recovery) | 单兵线 3v3 小地图、服务器权威 Tick、AI 兵线与防御塔、胜负判定、断线重连与事件回放 |
与相邻章节的关系
- 上一章:第 15 章 微型赛车系统 提供了回滚与插值的可复用经验,本章把「预测-校正」从单车扩展到多单位混战。
- 下一章:第 17 章 战棋对战 沿用本章的关键帧与增量恢复思路,但把实时帧改为回合步、把输入抽象为高层命令。
- 本章同层定位:与第 19 章战场吃鸡共用关键帧快照与一致性哈希设计,后者只是把并发规模从 8 人推到 200 人。