场景 29:多人在线游戏 (Online Multiplayer Game)
从一个单人 Canvas 小游戏,演进到全球对战的多人在线游戏。
V1 — 1 个用户:纯前端单人游戏
Section titled “V1 — 1 个用户:纯前端单人游戏”你想做一个简单的 2D 游戏:一个角色在画布上移动,有基本的游戏循环。
你要解决什么
Section titled “你要解决什么”- Canvas 2D 画布渲染
- 键盘控制角色上下左右移动
- 游戏循环:requestAnimationFrame 驱动更新和渲染
- 简单场景:角色 + 障碍物 + 可收集物品
给 AI 的 Prompt
Section titled “给 AI 的 Prompt”用 React + Canvas 2D 构建一个简单游戏。800x600 画布,一个方块角色(40x40,蓝色),WASD 键控制移动(速度 200px/秒)。随机生成 10 个障碍物(红色方块)和 5 个金币(黄色圆形)。角色不能穿过障碍物(碰撞检测),碰到金币则收集(金币消失,分数+1)。左上角显示分数。用 requestAnimationFrame 实现 60fps 游戏循环,用 deltaTime 保证帧率无关的移动速度。
- 角色可以上下左右移动
- 碰到障碍物被阻挡
- 碰到金币收集并加分
- 游戏以稳定帧率运行
- 移动速度在不同帧率下一致
你学到了什么
Section titled “你学到了什么”- Canvas 2D 渲染基础 → Module 1
- 游戏循环与 deltaTime → Module 1
- AABB 碰撞检测 → Module 2
V2 — 10 个用户:WebSocket 双人同步
Section titled “V2 — 10 个用户:WebSocket 双人同步”两个玩家在浏览器中同时游戏,能看到彼此的角色移动。
你要解决什么
Section titled “你要解决什么”- Go WebSocket 服务器同步游戏状态
- 两个浏览器标签 = 两个玩家
- 位置同步:每个玩家发送自己的位置,服务端广播
- 简单的玩家标识(颜色区分)
给 AI 的 Prompt
Section titled “给 AI 的 Prompt”用 Go + Gin 构建 WebSocket 游戏服务器。WebSocket /ws/game 端点,连接时分配玩家 ID 和颜色。客户端每帧发送 {type: “move”, x, y} 消息,服务端收到后广播给所有其他玩家 {type: “player_update”, playerId, x, y, color}。客户端维护所有玩家的位置,在 Canvas 上渲染所有玩家。玩家断开时广播 {type: “player_leave”, playerId}。服务端维护当前在线玩家列表。
- 两个浏览器标签显示两个不同颜色的角色
- 一个角色移动,另一个窗口实时看到
- 关闭一个标签后角色从另一个窗口消失
- 三个以上标签同时正常工作
- 网络延迟不明显影响体验
你学到了什么
Section titled “你学到了什么”- WebSocket 双向实时通信 → Module 3
- 游戏状态广播模式 → Module 4
- 客户端渲染远程玩家 → Module 4
V3 — 100 个用户:游戏房间系统
Section titled “V3 — 100 个用户:游戏房间系统”玩家需要创建或加入房间,每个房间独立运行游戏,支持碰撞检测和游戏规则。
你要解决什么
Section titled “你要解决什么”- 房间创建和加入(房间名/密码)
- 每个房间独立的游戏状态
- 多玩家位置 + 状态同步
- 服务端碰撞检测和游戏规则执行
给 AI 的 Prompt
Section titled “给 AI 的 Prompt”扩展为房间系统。Room 结构:ID、名称、密码(可选)、最大玩家数(4)、状态(waiting/playing/finished)、玩家列表。API:创建房间、房间列表、加入房间。WebSocket 消息增加 roomId。房间内游戏逻辑:所有玩家在同一场景,碰撞检测在服务端执行(玩家之间、玩家与障碍物),金币收集由服务端判定(防作弊)。房间状态:所有玩家准备后开始,金币全部收集后结算(显示排行榜)。用 PostgreSQL 存储房间记录和游戏结果。
- 可以创建和加入不同房间
- 不同房间的游戏互不影响
- 服务端碰撞检测正确
- 两个玩家同时靠近金币只有一个收集到
- 游戏结束后显示排行榜
你学到了什么
Section titled “你学到了什么”- 房间模式设计 → Module 5
- 服务端权威游戏逻辑 → Module 6
- 并发游戏状态隔离 → Module 5
V4 — 1000 个用户:客户端预测与延迟补偿
Section titled “V4 — 1000 个用户:客户端预测与延迟补偿”网络延迟让游戏操作感觉不跟手,需要客户端预测让操作立即响应。
你要解决什么
Section titled “你要解决什么”- 客户端预测:输入立即本地执行,不等服务端确认
- 服务端校验(权威服务器):服务端运行真正的游戏逻辑
- 状态回滚:收到服务端确认后,如果预测错误则回滚修正
- 延迟补偿:显示其他玩家插值后的位置
给 AI 的 Prompt
Section titled “给 AI 的 Prompt”实现客户端预测和延迟补偿。客户端:每次输入带序列号发送给服务端,同时本地立即执行(预测)。保留最近 60 帧的输入和状态快照。收到服务端确认(含序列号和确认位置)后,丢弃该序列号之前的快照,比较确认位置和预测位置,如果差异 > 阈值(2px),从确认状态重新应用后续输入(回滚+重放)。其他玩家的位置用插值(lerp)平滑显示,延迟约 100ms 的画面。服务端以固定 20tick/s 运行游戏逻辑,广播所有玩家的权威状态。
- 本地操作立即响应(无延迟感)
- 模拟高延迟(200ms)下游戏仍可玩
- 作弊客户端发送非法位置会被修正
- 其他玩家移动平滑无抖动
- 服务端 tick rate 稳定在 20/秒
你学到了什么
Section titled “你学到了什么”- 客户端预测 + 服务端权威 → Module 7
- 状态回滚与重放 → Module 7
- 实体插值(Entity Interpolation)→ Module 7
V5 — 1 万用户:独立房间服务器与匹配
Section titled “V5 — 1 万用户:独立房间服务器与匹配”单个服务器进程无法承载所有房间,需要独立的游戏服务器进程和匹配系统。
你要解决什么
Section titled “你要解决什么”- 大厅服务器 + 游戏服务器分离
- 每个游戏服务器进程承载 N 个房间
- 匹配系统:按技能等级匹配对手
- 玩家等级和排行榜
给 AI 的 Prompt
Section titled “给 AI 的 Prompt”分离大厅和游戏服务器。LobbyServer:处理登录、匹配请求、房间分配,不运行游戏逻辑。GameServer:独立进程,注册到 Redis(地址+当前房间数+负载),运行游戏逻辑。匹配流程:玩家请求匹配 → LobbyServer 将玩家放入 Redis 匹配队列(按 ELO 评分排序)→ 匹配器 goroutine 每秒检查队列,ELO 差距 < 200 的玩家配对 → 选择最空闲的 GameServer → 返回 WebSocket 地址给玩家。Player 表添加 elo_rating(初始 1000),每场游戏结束按 ELO 公式更新。排行榜用 Redis Sorted Set 实现。
- 大厅和游戏服务器独立运行
- 匹配后玩家连接到正确的游戏服务器
- 相近 ELO 的玩家被匹配在一起
- 胜负正确更新 ELO
- 排行榜实时更新
你学到了什么
Section titled “你学到了什么”- 服务分离架构 → Module 8
- ELO 匹配算法 → Module 9
- Redis 服务注册和发现 → Module 8
V6 — 10 万+ 用户:全球对战与反作弊
Section titled “V6 — 10 万+ 用户:全球对战与反作弊”全球玩家对战需要就近接入,作弊检测保障公平,回放系统支持复盘。
你要解决什么
Section titled “你要解决什么”- 区域服务器:玩家就近连接(亚洲/欧洲/美洲)
- 跨区匹配:不同区域玩家对战(选择中间节点)
- 反作弊:服务端校验 + 行为分析(异常移动速度检测)
- 回放系统:录制每帧输入,可重放整局游戏
给 AI 的 Prompt
Section titled “给 AI 的 Prompt”实现全球对战架构。区域配置(region: asia/europe/america + 服务器地址列表)。玩家登录时根据 IP 分配最近区域,同区域优先匹配。跨区匹配:两个区域的玩家匹配时,选择双方延迟总和最小的服务器。反作弊:服务端检查每 tick 移动距离是否超过最大速度 × 1.1(容忍误差),超过则强制回弹并记录警告,累计 3 次警告踢出。回放系统:每局游戏录制所有玩家输入序列到 replay 表(JSON 数组),回放时按时序重放输入,客户端本地模拟渲染。回放列表可按玩家/时间查询。
- 玩家连接到最近区域的服务器
- 跨区匹配延迟可接受
- 作弊行为被检测并惩罚
- 回放可以完整重现一局游戏
- 回放文件体积合理(只存输入不存状态)
你学到了什么
Section titled “你学到了什么”- 区域化部署架构 → Module 10
- 反作弊系统设计 → Module 11
- 确定性回放(Deterministic Replay)→ Module 7
- 全球延迟优化策略 → Module 10