在线联机原型全集:第 12 章 团队占点

团队占点(Team Domination) 类别:实时占点 + 区域控制 + 小队战术原型 目标:验证延迟补偿(时空回溯)、实时位置与控制判定、服务器权威与客户端预测、以及房间生命周期(创建→进行→加时→结算→销毁)的完整闭环。 原型代号:proto-012-team-domination 依赖模块 …

团队占点(Team Domination)

  • 类别:实时占点 + 区域控制 + 小队战术原型
  • 目标:验证延迟补偿(时空回溯)、实时位置与控制判定、服务器权威与客户端预测、以及房间生命周期(创建→进行→加时→结算→销毁)的完整闭环。
  • 原型代号proto-012-team-domination
  • 依赖模块proto-001-echo-chat(底座通讯)、proto-011-team-td(快照/回放/经济日志基建,可复用)
  • 推荐语言栈:Go / Java / Rust / TypeScript
  • 协议栈:HTTP(匹配/战报/回放索引) + WebSocket(状态/输入流) + Cron/DelayQueue(加时/定时事件)

1. 设计纲要(Design Brief)

目标:两队(或三队)在多据点地图上争夺控制权,通过占点进度与得分累积决定胜负。核心挑战在于:高并发移动+短时爆发对抗下,如何确保“谁在点内”“何时进入/离开”“控制条如何推进/回退”的公平一致

1.1 核心循环(Core Loop)

  1. 进入房间 → 角色选择/准备;
  2. 回合开始 → 据点激活,队伍分推;
  3. 实时对抗:进点→ contest(对峙)→ 清场→ 占领→ 防守;
  4. 得分累积:每个已控点每秒提供团队分;
  5. 终局:任一队达到目标分或时间耗尽;若分差极小触发加时
  6. 结算:战报、录像索引、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),判定其是否在点内。

  • 对峙规则:双方同时在点内 → 进度冻结;人数差≥阈值时,引入人数优势系数

  • 推进与回退

    • 当场内仅有 队 AprogressA += S * m_adv * Δt
    • 若点被 队 B 占有,则先 progressB -= S * Δt 回退至 0,再开始给 A 推进;
    • 推进至 T → 点权转移(Owned-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_seqserver_tick
  • 延迟估计:RTT/抖动估值用于客户端插值缓冲与 UI 延迟提示(显示“弱连接”)。

5. AOI 与广播(AOI & Broadcast)

  • AOI Cell:与地图对齐(16×16 Tile),订阅当前与邻接 Cell
  • 广播合并:移动/状态以玩家组播,点位进度以点位主题组播
  • 热度限流:当某点订阅人数激增,降低进度广播频率(如从 50ms→100ms),但关键边界(占满/清零/所有权转移)立刻广播;
  • 观战者(可选):订阅全图低频广播。

6. 房间生命周期(Room Lifecycle)

  1. Init:RoomMgr 拉起战斗实例,载入地图与点位配置;
  2. Ready:玩家入场,倒计时/阵营分配/角色选择;
  3. Active:回合运行(点位轮转/计分/复活);
  4. Overtime:加时;
  5. End:结算,生成战报与录像索引;
  6. 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)

  • 顺序

    1. 采集输入(移动/技能/复活确认);
    2. 回溯计算进入/离开集合;
    3. 刷新点位在场人数对峙态
    4. 计算推进/回退(含优势系数与速度上限);
    5. 所有权转换计分
    6. 生成事件包point.progress / point.owned / score.tick
    7. 指标/日志落地(可抽样)。

9. 协议草案(Protocol Sketch)

9.1 连接/心跳

  • HTTPPOST /match/queue;返回 room_id, ws_url, token
  • WS 子协议tdm.v1ping/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}

所有状态包带版本号 vtick;客户端按 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_sessions
  • tick_exec_ms{phase}(采集/回溯/占点/广播)
  • point_progress_rate{id}, point_contested_seconds{id}
  • rewind_hits_total, rewind_window_ms_p95
  • enter_debounce_hits, leave_debounce_hits
  • overtime_occurrences, overtime_duration_seconds
  • reconnect_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)

  1. M1(2 周):单点占领 + 进入/离开去抖 + 基础回溯;
  2. M2(+2 周):多点轮转 + 得分/加时 + 战报;
  3. M3(+2 周):AOI 广播与热点限流 + 回放;
  4. M4(+2 周):反作弊规则与审计日志 + 压测脚本;
  5. 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/日志能力,成为你联机原型序列中对抗机制验证**的关键支点。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页