Pong 是游戏史的起点,也是实时对战架构的 Hello World。两个挡板、一颗球,规则简单到可以在纸上画完,但「在 60 FPS 下稳定跑一场跨国对战」这句话背后,压着实时同步的全部难题:输入延迟、Tick 一致性、客户端预测与服务器纠正、插值与外推、丢包与抖动、观战延迟。本章是全书第一个真正意义上的「实时」章节,前面五章积累的通道、匹配、裁定能力,在这里第一次被压到毫秒级的预算里去用。
本章定位
- 难度梯度:高阶入门。这是全书难度曲线的第一个陡坡,从「回合制」正式跨入「实时制」。
- 前置章节:第 1 章 聊天室 提供通道,第 5 章 你画我猜 提供连续数据流的同步经验。
- 能力跃迁:从「事件驱动」跃迁到「帧驱动」。状态不再因玩家操作而改变,而是随时间步自行演进,玩家操作只是注入的扰动。
- 阅读时长:单篇 PRD 约 500 行,建议重点读 Tick 时序图、预测与纠正回路、插值外推三节,最好配合一个可调延迟的本地测试环境动手。
核心验证目标
- Tick 驱动引擎:60Hz 固定时间步更新,服务器与客户端共用同一套确定性模拟,保证同输入同结果。
- 客户端预测:输入本地立即生效,用预测隐藏往返延迟,避免操作手感被 RTT 拖累。
- 服务器权威与纠正:收到权威状态后按未确认输入序列回滚重放,实现 Server Reconciliation。
- 插值与外推:远端实体的平滑显示,处理渲染帧率与逻辑 Tick 不同步的问题。
- 丢包恢复:区分可靠通道与不可靠通道,决定哪些数据重传、哪些允许丢弃。
- 延迟观战管线:观战者延迟数个 Tick 播放,通过 Replay Buffer 换取信息隔离与平滑性。
- 状态快照与重演:周期快照支持断线恢复,同时为确定性重演提供基准点。
技术栈建议
- 语言:Go、Rust、C++ 或 TypeScript。Rust 与 C++ 更适合对确定性模拟与浮点行为做精细控制。
- 传输:UDP(QUIC)优先,WebSocket 二进制帧作为可回退方案。本章是全书第一次认真讨论 UDP。
- 存储:状态快照按 Tick 序列落盘,用于回放与恢复。
- 关键设计:逻辑 Tick 与渲染帧彻底解耦,模拟层不依赖任何渲染或 IO,这是后面第 15 章回滚同步能够复用的前提。
本章文章
| 文章标题 | 核心内容 |
|---|---|
| 在线联机原型全集:第 6 章 Pong 对战(Realtime 60 FPS 原型) | 完整 PRD:Tick 驱动引擎、预测控制器、服务器校正、插值外推、观战管线与回放日志的设计,含 11 分制对局流程与丢包策略 |
本章只有一篇 PRD;更激进的回滚式同步(Rollback Netcode)要到第 15 章的微型赛车才展开。
与相邻章节的关系
- 上一章:第 5 章 你画我猜 建立连续数据流同步,本章把它压进固定时间步。
- 下一章:第 7 章 贪吃蛇大作战 把 1v1 扩展到上百个实体,引入 AOI 与分区广播来解决带宽问题。