在线联机原型全集:第 12 章 团队占点(Team Domination)
类别:实时占点 + 区域控制 + 小队战术原型 目标:验证延迟补偿(时空回溯)、实时位置与控制判定、服务器权威与客户端预测、以及房间生命周期(创建→进行→加时→结算→销毁)的完整闭环。 原型代号:
proto-012-team-domination依赖模块:proto-001-echo-chat(底座通讯)、proto-006-room-gateway(匹配/房间)、proto-008-aoi-grid(AOI 网格广播)、proto-011-team-td(快照/回放/经济日志基建,可复用) 推荐语言栈:Go / Java / Rust / TypeScript 协议栈:HTTP(匹配/战报/回放索引) + WebSocket(状态/输入流) + Cron/DelayQueue(加时/定时事件)
1. 设计纲要(Design Brief)
目标:两队(或三队)在多据点地图上争夺控制权,通过占点进度与得分累积决定胜负。核心挑战在于:高并发移动+短时爆发对抗下,如何确保“谁在点内”“何时进入/离开”“控制条如何推进/回退”的公平一致。
1.1 核心循环(Core Loop)
- 进入房间 → 角色选择/准备;
- 回合开始 → 据点激活,队伍分推;
- 实时对抗:进点→ contest(对峙)→ 清场→ 占领→ 防守;
- 得分累积:每个已控点每秒提供团队分;
- 终局:任一队达到目标分或时间耗尽;若分差极小触发加时;
- 结算:战报、录像索引、Elo/匹配分/任务更新。
1.2 成功标准(验收口径)
- 公平性:延迟≤200ms 时,进入/离开点位判定误差不影响胜负(容错≤1帧)。
- 一致性:所有客户端在 2 秒内对“点位状态(中立/占领中/已占领)”达成一致。
- 容量:单房 8–16 人;128 房并发;服务器 p95 帧时延 ≤ 12ms(逻辑帧 50–100ms)。
- 容灾:断线 10s 内重连恢复;录像重放与快照校验一致。
- 可观测性:进入/离开事件、占点进度、回滚与回放原因可追溯(带版本与因果链)。
2. 世界与规则(World & Rules)
2.1 地图与据点(Control Points)
-
地图尺寸:采用 96×96 或 128×128 Tile(与 AOI cell 对齐)。
-
据点形态:圆形/环形/复合形;每点定义控制半径 R、占领阈值 T、占领速率 S。
-
点位状态:
Neutral(中立)/Contested(对峙)/Capturing-X(X队占领中)/Owned-X(X队占领)。 -
激活节奏:
- 同步激活(A/B/C 同时活跃);
- 轮转激活(A→B→C,每 90s 轮转);
- 随机激活(从候选集中抽取 2 点)。
2.2 占点判定(Capture Logic)
-
进入判定:以服务端为权威,对玩家位置历史做时空回溯(rewind to
ts_client),判定其是否在点内。 -
对峙规则:双方同时在点内 → 进度冻结;人数差≥阈值时,引入人数优势系数。
-
推进与回退:
- 当场内仅有 队 A:
progressA += S * m_adv * Δt; - 若点被 队 B 占有,则先
progressB -= S * Δt回退至 0,再开始给 A 推进; - 推进至 T → 点权转移(
Owned-A),每秒为队 A 产生得分。
- 当场内仅有 队 A:
-
拥挤抖动:使用进入/离开去抖(hysteresis):必须连续 2 帧在点内才认定“进入”,连续 2 帧在点外才认定“离开”。
2.3 得分与胜负
-
计分:每个已控点每秒 +X 分;或按点位权重(中心点 ×2)。
-
终局:
- 目标分(如 200 分)先达者胜;
- 时间到,分高者胜;
- 加时:当到时刻点位处于 Contested,或分差 ≤ 阈值且活跃点仍在战斗,延长至“点不再对峙且有占有者”的时刻。
3. 玩家与职业(Players & Roles)
-
移动:加速度/减速度,服务器插值与速度上限校验。
-
职业雏形(可选):
- 先锋:冲锋位移;点内获得短暂护盾。
- 干扰:烟雾/沉默/陷阱,拖住对手推进。
- 支援:治疗与移速光环,鼓励团推。
-
复活机制:固定复活点,倒计时 10–15s;或夺点复活(点内复活速度加成)。
4. 网络与延迟补偿(Netcode & Lag Compensation)
4.1 模型选择
- 服务器权威(Authoritative Server):一切占点状态由服务器决定。
- 客户端预测(Client Prediction):本地移动即时反馈;
- 服务器校正(Server Reconciliation):按
last_confirmed_input_seq回滚并重放未确认输入。
4.2 时空回溯(Rewind)
-
服务器维护最近 N 秒(建议 1.5–2.0s) 的位置环形缓冲(tick→{player→pos})。
-
收到
Enter/Move输入,读取该输入的客户端时间戳ts_client(或序号推导),回溯至最接近 tick:- 几何判定:
dist(pos_rewind, point.center) <= R + padding; - LOS/障碍(可选):射线检测是否被障碍阻断(对“占点可视化区域”玩法有用)。
- 几何判定:
-
回溯严格只用于判定进入/离开;点内停留的累积时间以服务器当前 tick 计时,避免长延时刷取“假停留”。
4.3 反抖与稳定(Stability)
- 进入/离开滞回:两帧确认制;
- 最小持续:进入点内 < 200ms 不计入推进(反“蹭点”);
- 速度阈值:进入瞬间速度 > 上限×k,则判为“穿越”,需要下一帧仍在点内才生效。
4.4 丢包/乱序
- 输入包序号:
seq单调递增,服务器丢弃过旧,缓存乱序; - 确认回包:服务端周期性附带
ack_seq与server_tick; - 延迟估计:RTT/抖动估值用于客户端插值缓冲与 UI 延迟提示(显示“弱连接”)。
5. AOI 与广播(AOI & Broadcast)
- AOI Cell:与地图对齐(16×16 Tile),订阅当前与邻接 Cell;
- 广播合并:移动/状态以玩家组播,点位进度以点位主题组播;
- 热度限流:当某点订阅人数激增,降低进度广播频率(如从 50ms→100ms),但关键边界(占满/清零/所有权转移)立刻广播;
- 观战者(可选):订阅全图低频广播。
6. 房间生命周期(Room Lifecycle)
- Init:RoomMgr 拉起战斗实例,载入地图与点位配置;
- Ready:玩家入场,倒计时/阵营分配/角色选择;
- Active:回合运行(点位轮转/计分/复活);
- Overtime:加时;
- End:结算,生成战报与录像索引;
- Destroy:销毁房间,延迟 T 秒保留最后快照供掉线者取回。
动态缩编:若玩家大量离场,可触发提前结束或机器人补位(Server AI)。
7. 数据与配置(Data & Config)
7.1 点位配置(示例)
points:
- id: "A"
center: [48, 32]
radius: 9.5
threshold: 100 # T
speed: 4.0 # S (progress per second)
weight: 1.0
activation: "always" # 或 schedule: [0-180s]
- id: "B"
center: [64, 56]
radius: 8.0
threshold: 120
speed: 3.2
weight: 1.5
activation: "rotate:90s"
7.2 人数优势(可选)
m_adv = 1 + k * clamp((num_A - num_B), 0, M),例如 k=0.2, M=3。
注意不要指数化增长,避免“滚雪球”。
8. 服务端循环(Server Frame Loop)
-
Tick:50ms(20 FPS)或 100ms(10 FPS)
-
顺序:
- 采集输入(移动/技能/复活确认);
- 回溯计算进入/离开集合;
- 刷新点位在场人数与对峙态;
- 计算推进/回退(含优势系数与速度上限);
- 所有权转换与计分;
- 生成事件包:
point.progress/point.owned/score.tick; - 指标/日志落地(可抽样)。
9. 协议草案(Protocol Sketch)
9.1 连接/心跳
- HTTP:
POST /match/queue;返回room_id, ws_url, token - WS 子协议:
tdm.v1;ping/pong每 5s;60s 无操作踢出
9.2 典型消息
// C2S: 移动输入(预测)
{"op":"move", "seq":1023, "ts":1730798400123, "vx":1.2, "vy":0.7}
// S2C: 位置校正(含 ack)
{"ev":"reconcile", "ack":1023, "tick":8801, "id":"P8", "pos":[62.1,35.4], "vel":[1.0,0.6]}
// S2C: 点位进度
{"ev":"point.progress","id":"A","owner":"A","progress":74.5,"state":"capturing","tick":8802,"v":120031}
// S2C: 点权转换
{"ev":"point.owned","id":"A","owner":"A","score_rate":1.0,"tick":8820,"v":120099}
// S2C: 计分心跳(每秒)
{"ev":"score.tick","A":102,"B":98,"time_left":245}
所有状态包带版本号
v与tick;客户端按v去重与次序化。
10. 延迟与不公平优势对策(Fairness Toolkit)
- 输入时间戳可信域:仅允许回溯至
now - 400ms(或max(RTT*1.5, 300ms)),超过丢弃或削权(进入后需 1 帧缓冲才计入)。 - 速度/加速度上限:服务器校验,异常时钳制并记审计分。
- 占点外刷分:明确必须在点内可用区域(排除“卡边缘”)。
- 击退/位移技能:以服务器碰撞几何为准,客户端仅表现;避免“被反打回去了但本地还在点内”。
11. 反作弊(Anti-Cheat)
- 移动异常:速度/位移跳跃、穿越阻挡;
- 时间篡改:连续上传未来时间戳或过旧序号;
- 位置震荡:利用抖动骗取“在场”判定 → 通过最小持续/去抖抵御;
- 客户端改包:关键字段签名/校验;
- 热区监控:某点位出现占点效率异常触发审核(录像标记)。
12. 指标与日志(Observability)
12.1 指标(Prometheus)
room_active_total,ws_active_sessionstick_exec_ms{phase}(采集/回溯/占点/广播)point_progress_rate{id},point_contested_seconds{id}rewind_hits_total,rewind_window_ms_p95enter_debounce_hits,leave_debounce_hitsovertime_occurrences,overtime_duration_secondsreconnect_latency_ms,state_resync_bytes
12.2 日志通道
- ControlLog:进入/离开、占点推进、权属转换;
- MoveLog:速度/校正/钳制;
- AuditLog:回溯超窗、异常时间戳、加速度异常;
- ReplayLog:快照索引与增量事件流。
13. 客户端表现(Client UX)
- HUD:点位条(中立/对峙/占领)、圈层高亮、在场人数计数;
- 延迟指示:RTT 与“服务器已确认”标识;
- 边界提示:进入/离开点的屏幕提示(避免误解);
- 加时:显著 UI 与语音提示;
- 观战(可选):自由视角或队友跟随。
14. 容量与伸缩(Capacity & Scaling)
- 网关:10k WS/实例;
- 战斗服:多房共进程(线程池);
- 历史缓冲:位置环缓冲
Players × ticks × pos(12B),典型 16 人 × 40 tick ≈ 7.7KB/房; - 广播:点位事件低频(100–200ms)+ 关键帧即时,热点限流合并。
15. 测试与验收(Testing & QA)
15.1 单元/组件
- 回溯判定:构造轨迹与时间戳,校验“进入/离开/对峙/推进”。
- 去抖与最小持续:抖动轨迹不应计入推进。
- 人数优势:不同人数组合下的推进速率符合公式。
15.2 压测/对抗
- 高延迟混合:RTT 30/60/120/200ms 混合;占点结果一致性检查。
- 断连风暴:20% 客户端断开并重连;房间状态应连续。
- 热点挤压:单点 12–16 人团战;观察广播与 CPU 曲线。
15.3 回归/重放
- 使用 ReplayLog 重放整局;核对每次所有权变更时刻与得分曲线。
16. 经济与进度(可选扩展)
- 赛后奖励:占点时长/团队协作加成;
- 段位:Elo 或 Glicko-2;
- 任务:在点内停留 N 秒、对峙中击退对手 X 次。
17. 安全与隐私(Security & Privacy)
- JWT 鉴权,房间内权限(旁观/选手)隔离;
- 速率限制:移动/输入包限速与突发桶;
- 日志最小化:位姿历史仅保留 N 秒;录像遵从玩家同意。
18. 失败模式与对策(FMEA)
| 失败模式 | 影响 | 监控/对策 |
|---|---|---|
| 回溯窗口不足 | 高延迟玩家“穿点”不被计入 | 动态扩窗上限;超窗提示与削权 |
| 广播拥塞 | 客户端状态延迟 | AOI 合并/限流,关键事件优先 |
| 速度作弊 | 非法秒进秒出刷进度 | 速度钳制 + 最小持续 |
| 房间空置 | 比赛失衡 | 机器人补位/提前结算/重排 |
19. 里程碑(Milestones)
- M1(2 周):单点占领 + 进入/离开去抖 + 基础回溯;
- M2(+2 周):多点轮转 + 得分/加时 + 战报;
- M3(+2 周):AOI 广播与热点限流 + 回放;
- M4(+2 周):反作弊规则与审计日志 + 压测脚本;
- M5(+2 周):职业技能雏形 + 段位与任务。
20. 开发清单(Backlog 摘要)
- 回溯缓存与几何判定库(圆/多边形/障碍)
- 占点状态机与去抖策略
- 人数优势与推进/回退公式实现
- AOI 主题广播与关键事件优先队列
- 房间加时/结算/摧毁调度器(DelayQueue)
- 录像:快照 + 增量事件编码
- 压测:延迟混合/热点团战/断连重连
- 审计:速度钳制/超窗回溯/异常时间戳
21. 验收剧本(Playbook)
- 剧本 A:A 队三人同时冲点,B 队两人守点 → 应出现
Contested,无推进;A 队击退 1 人→ A 端推进速率提升。 - 剧本 B:高延迟玩家(200ms)从点外冲入,服务器回溯后正确认定进入时刻,不产生“鬼影”推进。
- 剧本 C:点权转换瞬间广播拥塞 → 仍应即时抵达全体订阅者。
- 剧本 D:读秒结束时仍
Contested→ 触发加时,直至点不再对峙且有占有者。 - 剧本 E:10 人同时断线 3s → 重连后 2s 内恢复到当前点位状态与比分。
结语
proto-012-team-domination 从几何进入/离开的微观判定,到进度推进/对峙/所有权转换的宏观节奏,再到回溯与对时的网络公平性,形成了**“实时位置 + 延迟补偿 + 房间生命周期”的可复用底座。
该原型可直接演进为:据点攻防(攻/守不对称)、推车/护送、占圈生存等多种 PvP 模式,并与上一原型(塔防)共享快照/回放/AOI/日志能力,成为你联机原型序列中对抗机制验证**的关键支点。