在线联机原型全集:第 11 章 团队塔防(Team Tower Defense)
类别:实时协作塔防 + AOI 同步 + 资源共享 + 一致性结算 目标:验证 AOI(兴趣区域)同步、队伍资源共享(经济同步)、权威服结算与快照、断线重连与回放、延迟队列驱动的波次调度。 原型代号:
proto-011-team-td依赖模块:proto-001-echo-chat(底座通讯)、proto-002-rps(锁步回合同步雏形)、proto-006-room-gateway(房间/网关)、proto-008-aoi-grid(AOI 网格广播) 推荐语言栈:Go / Java / Rust / TypeScript 协议栈:HTTP(匹配/编排/回放) + WebSocket(战斗实时流) + Cron/DelayQueue(波次与任务调度)
1. 设计纲要(Design Brief)
目标场景:2–6 名玩家协作,基于网格化地图建塔、协同升级与技能联动,抵御多路径敌军波次进攻。以 AOI 限域同步 降低广播开销,验证 共享经济 + 权威结算 + 快照/回放 + 重连恢复 的一套完整联机内核。
1.1 核心循环(Core Loop)
- 进入房间 → 准备阶段(资源/塔点预规划)
- 波次调度(DelayQueue)→ 敌军生成与路径推进(服务器权威)
- 玩家操作:建塔/升级/卖塔/释放技能/资源捐赠
- 服务器按帧执行:塔攻击 → 敌军受击/状态 → 奖励/掉落 → 资源入账
- 波间结算与团队分配 → 下一波开始
- 终局:通关 / 基地 HP 归零 → 结果快照 → 录像落盘
1.2 成功标准(验收口径)
- 同步性:≥95% 操作在 150ms 内达成“观察者可见”(同 AOI)。
- 一致性:客户端状态偏差 < 1%(资源/血量/塔等级误差率)。
- 容灾:断线 10s 内重连恢复,重放 ≤ 2s 完成。
- 扩展性:128 房间并发、每房 6 人、每房地图对象(塔+怪)峰值 1,200。
- 可观察性:战斗日志、经济日志、广播指标与热点 AOI 视图完整。
2. 世界与地图(World & Map)
2.1 地图结构
- 尺寸:128×128 Tile 网格;可参数化(64/96/128)。
- 路径:3–5 条敌军路径(Waypoints),支持分叉与汇合。
- 塔位(Build Slots):预设可建点 + 限位规则(路径旁 2 格内可建)。
- AOI 网格:8×8 的 AOI Cell(每 Cell ≈ 16×16 Tile),邻区广播。
2.2 数据定义(简化)
{
"map_id": "ttd_forest_01",
"tiles": [/* 索引或压缩RLE */],
"paths": [
{"id":"p1","waypoints":[[4,120],[10,100], ... ,[120,4]]}
],
"build_slots":[{"id":"b_001","x":12,"y":98,"tags":["ground"]}],
"aoi": {"cell_size":16}
}
3. 实体与战斗(Entities & Combat)
3.1 敌军(Creep)
- 基础字段:
id,type,hp,armor,speed,elem,resist,position,path_id,ai_state - 状态:减速(slow)、灼烧(burn)、缴械(disarm)、护盾(shield)
- 掉落:金币、能量碎片(团队共享池/个人钱包依据模式)
3.2 防御塔(Tower)
- 类型:箭塔(单体DPS)、炸弹塔(AOE)、冰塔(控制)、激光塔(穿透)
- 升级:Lv1–Lv5;协作升级 支持多名玩家联合支付→触发团队光环
- 光环样例:双人+10% 攻速;三人+15% 射程;全员+5% 暴击+群体微治疗
3.3 技能(Skills)
- 个人技能:瞬发/引导,冷却绑定角色
- 团队技能:需要共享能量,如“全图冰封 3s”“临时护盾 10s”
3.4 公式(参考)
- 伤害期望:
D = (atk - armor) * (1 + crit_rate*crit_multi) * elem_bonus * buffs - 减速叠加:
slow = 1 - Π(1 - slow_i)(避免线性叠加超标) - 经济加成:按参与度(伤害/控制/击杀/支援)分配权重
4. 经济与共享(Economy & Sharing)
4.1 模式
- 完全共享:所有金币入团队池,由队长/投票分配(或策略自动分配)
- 半共享(推荐):每波基础金平均 + 绩效金按权重分 + 个人击杀金
- 完全独立:教学/休闲
4.2 经济事件
GoldEarn(room, player, amount, reason)Donate(room, from, to, amount)(队友捐赠)LockTower(room, towerId)(协作升级锁定)UpgradeShared(room, towerId, contrib[])
4.3 事务与一致性
-
单房间内使用 单分区顺序日志(Kafka/Raft/内存 WAL)+ 原子批处理:
- 帧内聚合“经济变更” → 一次性应用(幂等
txn_id) - 最终一致事件 推送至 AOI 观察者(带
version与hash)
- 帧内聚合“经济变更” → 一次性应用(幂等
5. 同步模型(Sync Model)
5.1 帧参数
- 逻辑帧:100ms/帧(10 FPS 服务端逻辑)
- 通知与渲染:客户端 60 FPS 插值表现(预测 ≤ 150ms)
5.2 输入与广播
- 客户端仅上传“意图”(Place/Upgrade/Sell/Skill/Donate),服务器权威
- 广播采用 AOI 限域 + 邻区 “边界膨胀”(padding=1 cell)
- 高频(位置/HP)→ 压缩状态包;低频(建塔/升级/技能)→ 事件包
5.3 快照与重连
- 每 1s 全量快照(结构化 + 位姿流)存环形缓冲(近 60s)
- 重连:下发最近快照 + 增量事件回放(
since_version) - 录像:战斗结束将帧日志/快照索引落盘供复盘
6. AOI 系统(Area of Interest)
6.1 划分
- 网格 AOI:16×16 Tile 为一 Cell
- 订阅集:
S(player) = cell(player) ∪ neighbors(cell) - 对象索引:每对象维护“当前所属 Cell 列表”
6.2 事件路由
- 位置更新 → AOI 更新 → 差集计算(离开/进入观察集)
- Publish(key=aoi:cellId, event) → Fanout 给订阅者
- 控制背压:Cell 级消息队列限速 + 合并(coalesce)相同目标的频繁属性
7. 房间与匹配(Rooms & Matchmaking)
7.1 房间生命周期
Init:拉起战斗服实例,加载地图Ready:玩家进房,准备、分配建塔预案Active:波次运行(若干回合)End:结算/录像/清理Destroy:释放房间(T+30s 容错缓冲)
7.2 匹配队列(简)
- 以 队伍规模、段位/胜率、延迟 为主键
- 超时回退:3 人也可开局(动态难度降阶)
8. 协作机制(Co-Op Mechanics)
8.1 协作升级(核心特色)
- 提交协作请求 → 服务器锁定塔位(
lock_ttl=3s) - 聚合多名玩家贡献(金币/能量)→ 升级成功 → 触发团队光环
- 失败(超时/撤销/断线)→ 自动回滚贡献
8.2 支援信道
SOS:标记防线失守风险 → AOI 邻区收到提醒Assist:派发临时炮台/地形陷阱(消耗共享能量)Donate:快捷捐赠指定金额(固定档位 + 输入)
9. 协议与消息(Protocol & Messages)
9.1 会话
- 认证:HTTP 登录 → JWT → 升级 WebSocket(子协议
ttd.v1) - 心跳:
ping/pong5s;空闲踢出:60s
9.2 典型消息(精简)
// C2S: 建塔
{"op":"tower.place","rid":"R123","slot":"b_001","type":"arrow","nonce":"x"}
// S2C: 建塔确认(AOI 广播)
{"ev":"tower.placed","rid":"R123","id":"t_789","slot":"b_001","owner":"P2","lv":1,"v":1024}
// C2S: 协作升级提交
{"op":"tower.upgrade.shared","rid":"R123","tower":"t_789","contrib":{"gold":120},"nonce":"y"}
// S2C: 协作升级成功(团队光环)
{"ev":"tower.upgraded","rid":"R123","id":"t_789","lv":2,"aura":"aspd+10%","v":1031}
// S2C: 快照(重连/校准)
{"ev":"snapshot","rid":"R123","tick":880,"state":{ /* 压缩 */ },"v":1100}
注:所有事件携带单调递增版本号
v与tick;客户端按v校正乱序。
10. 服务器架构(Server Architecture)
Client
└─WS──► Gateway(鉴权/路由/限流/心跳)
└─► Matchmaker(队列/编队)
└─► RoomMgr(房间编排/伸缩)
└─► BattleServer(单房)
├─ FrameLoop(100ms)
├─ AOI Service(Cell PubSub)
├─ Tower/Enemy Systems
├─ Economy & Txn Log
├─ Snapshot/Replay
└─ WaveScheduler(DelayQueue)
- 部署:单房间单进程(轻量),叠加多实例;或 多房共进程(共享线程池)。
- 数据:房间内存态 + 异步持久(Result/Replay)
- 可选:同区多房共享 AOI Broker(进程内 Bus 或 NATS/Redis Stream)
11. 调度与波次(Waves & Scheduler)
11.1 调度
DelayQueue按T+Δ投递:生成怪、Boss、随机事件- Cron 触发赛季/日常任务刷新(非战斗时段)
11.2 波次模板
waves:
- id: 1
spawns:
- type: grunt
count: 20
path: p1
interval_ms: 500
reward:
base_gold: 120
- id: 10
spawns:
- type: boss_golem
count: 1
path: p3
reward:
base_gold: 500
chest: epic
12. 反作弊与容错(Security & Fault Tolerance)
- 输入鉴别:服务器判权 + 语义校验(塔位合法/冷却/资源充足)
- 重放与篡改:
nonce + ts;重复nonce拒绝 - 预测与回滚:客户端仅弱预测 UI,状态以权威帧为准
- 断线重连:快照 + 增量补齐;期间服务器仍推进
- 幂等事务:
txn_id与 WAL 去重
13. 指标与日志(Metrics & Logging)
13.1 指标(Prometheus 语义)
ws_active_sessions,room_active_total,frame_exec_msaoi_broadcast_qps,aoi_cell_backlogecon_txn_rate,econ_rollback_countreconnect_latency_ms,snapshot_size_bytestick_drift_ms(客户端→服务器漂移估计)
13.2 日志通道
- BattleLog:帧→事件(放置/击杀/Boss 死亡)
- EconomyLog:入账、支出、捐赠、协作升级
- AuditLog:异常操作、失败原因
- PerfLog:广播合并率、背压触发、热点 AOI
14. 客户端(Client)
14.1 前端栈
- Web:TypeScript + WebGL/WebGPU(表现层独立于逻辑)
- 预测:UI 即时反馈,实际以服务器确认覆盖
- 插值/外推:怪物位置线性插值;状态条平滑过渡
14.2 UI 关键界面
- 队伍资源面板(共享池/个人钱包/捐赠快捷键)
- 协作升级弹窗(贡献条/超时倒计时)
- AOI 观测边界提示(出入区域动画)
- 波次时间线与事件轨(即将到来的精英/Boss)
15. 数据结构与存储(Data & Storage)
15.1 热态(内存)
RoomState、AOI Index、FrameBuffer、TxnAccumulator- 键空间:
room:{id}:*(可落入本地 KV 做热备)
15.2 冷态(持久)
- 战斗结果(SQL/OLAP):胜负、用时、伤害、贡献、资源曲线
- 录像索引(对象存储):
room_id/date/seq→ 帧日志与快照切片 - 平衡表(JSON/YAML):塔/怪/技能参数
16. 负载与容量规划(Capacity Planning)
| 维度 | 目标 |
|---|---|
| 每房广播 | 平均 1–3 KB/帧/人(AOI 合并后) |
| 网关连接 | 10k WS/实例(Go epoll/kqueue) |
| 战斗服 | 64–128 房/实例(多房共进程) |
| 存储 | 录像每房 10–30 MB/局(压缩) |
17. 测试计划(Test Plan)
17.1 单元/仿真
- 战斗逻辑:塔射击→命中→抗性→DOT/Slow 叠加
- 经济事务:协作升级并发提交→一致性→回滚
- AOI:移动穿越 Cell 边界 → 订阅差集正确
17.2 压测
- 广播压力:热点 Cell 怪群 + 集中技能 → 背压曲线
- 重连风暴:同时 20% 客户端断开 → 恢复时延
- 波次峰值:Boss + Adds(召唤小怪) → 帧耗跟踪
17.3 回归
- 版本回放相同性(录像 → 重演 → Hash 对比)
- 资源泄露与 GC 抖动分析(p99 帧耗稳定)
18. 风险与对策(Risks & Mitigations)
| 风险 | 影响 | 对策 |
|---|---|---|
| AOI 热点 | 广播尖峰 | 合并/限速;扩邻区仅对慢变更 |
| 协作升级竞争 | 体验撕扯 | 锁+TTL;投票快速决策 |
| 重连期间位姿漂移 | 画面撕裂 | 最近快照+插值;HUD 提示“同步中” |
| 波次模板失衡 | 策略崩塌 | A/B 参数与 Telemetry 曲线校准 |
19. 玩法拓展(Modes & LiveOps)
- PvP-TD:双方互派怪(经济对冲)
- 无尽模式:爬榜,周榜结算
- 工坊(UGC):塔/地图脚本沙箱(Lua/QuickJS),审核与签名
- 赛季制:科技树与皮肤通行证
20. 里程碑(Milestones)
- M1(2 周):单人塔防 + 波次调度 + 录像落盘(本地)
- M2(+2 周):2–4 人联机 + AOI 广播 + 断线重连
- M3(+2 周):协作升级 + 半共享经济 + 指标告警
- M4(+2 周):Boss/精英生态 + 快照回放 + 压测报表
- M5(+2 周):UGC 地图 + 赛季通行证(雏形)
21. 开发清单(Backlog 摘要)
- AOI 索引与订阅差集算法
- 帧内经济事务聚合器(WAL/幂等)
- 协作升级锁与贡献汇聚
- DelayQueue 波次与事件调度器
- 录像编码与增量回放
- 指标/日志/热图(AOI 热点)
- 压测脚本与对抗场景库
22. 验收剧本(Playbook)
- 剧本 A:三人分线 + 双人协作升二级冰塔 → 波 5 精英冻结成功,基地无伤
- 剧本 B:共享经济偏置给新手 → 新手线稳态,通过捐赠/支援弥补短板
- 剧本 C:Boss 波处置 → 团队技能链(护盾→冰封→爆裂)+ 资源极值测试
- 剧本 D:断线重连风暴 → 10 名客户端轮流断线,快照恢复验证
23. 总结
《团队塔防》不仅是一款多人协作塔防原型,更是:
- 一个 多人同步与AOI技术沙盒;
- 一个 资源共享与团队经济的实验模型;
- 一个 战斗结算、一致性同步、快照回放的综合验证环境。
该项目具备以下验证价值:
- ✅ 可验证分布式AOI广播系统;
- ✅ 可验证共享经济同步机制;
- ✅ 可验证多人一致性、快照回放与断线重连;
- ✅ 可演进至PvP塔防或SLG混合原型;
- ✅ 可作为 后续大型游戏(如SLG/MMO)战斗服核心雏形。