在线联机原型全集:第 19 章 战场吃鸡
战场吃鸡(Large-Scale Realtime|Area Broadcast & Shrinking Circle)
- 类别:大型实时射击/生存对战(Solo/Duo/Squad)
- 目标:验证在 100–200 并发玩家下的区域广播(AOI)吞吐、缩圈系统的公平与可控节奏、投掷物/载具/空投的确定性模拟、掉线/重连/观战体验与服务端弹性扩缩容。
- 原型代号:
proto-019-br-aoi-circle - 依赖模块:
proto-007-snake-battle(实时骨架)、proto-015-mini-race-rollback(回滚/插值经验)、proto-016-mini-moba(关键帧/快照/一致性哈希)、proto-017-tactic-lockstep(事件溯源思想) - 推荐栈:Server(Go/Java,Go 优先 + ECS/Bitset 组件)、Client(TS/Unity/Unreal),Physics(服务器半确定性/参数下放)
- 协议栈:UDP(状态与输入主通道,带 FEC) + WebSocket(控制/房间/观战/恢复)
- 服务器 Tick:20Hz(50ms/帧);客户端渲染 60fps;AOI 推送节流 10–20Hz 可配置
1. 核心玩法与范围
- 规模与模式:100–200 人;Solo / Duo / Squad(4)。
- 地图:2×2 km ~ 8×8 km;分区地形(城镇/丘陵/树林/河道/海岸)。
- 物品与装备:枪械/配件/护具/药品/投掷物;背包容量与重量。
- 载具:摩托/皮卡/船(可选);燃料与耐久。
- 胜负:最后一队(或一人)存活获胜。
- 关键系统:AOI 区域广播、缩圈、空投、信号枪(可选)、蓝圈伤害曲线、战斗日志与回放。
2. 总体架构
2.1 逻辑划分
- 网关(Gateway):UDP 打洞/握手、会话校验、包序/丢包统计、区域路由。
- 房间(Match):核心模拟(Tick)、AOI 服务、缩圈控制、投掷物与投射体、载具物理、战斗结算。
- 世界数据(WorldStore):地图瓦片/碰撞网格/刷新点/战利品表。
- 回放与日志(Replay/Log):事件溯源(输入/命中/死亡/圈变)、关键帧快照。
- 编队与匹配(MM/Party):队伍/语音房(语音可外置)。
- 观战/转播(Spectator):服务端视角或裁剪视角流。
2.2 扩展性
- 同服多房:每个进程 1–8 房(按 CPU 调度),100 人房间 p95 Tick < 40ms;
- 分区 AOI:按地理分片(Grid/Quadtree/Hilbert curve 分桶),跨分片广播通过边界网关;
- 无共享状态:每房独立;共享资源仅地图只读数据、排行榜写入。
3. AOI(Area of Interest)区域广播
3.1 网格与订阅
-
空间索引:固定网格(如 64×64 / 128×128)或四叉树;每格维护近邻集合与主题 Channel。
-
订阅模型:
- 玩家/实体加入格子 → 订阅该格及其k-邻域(k=1–2);
- 进入/离开格子触发增量订阅/退订;
- 服务端对每个订阅者维护可见实体集合与上次版本号。
3.2 广播策略
- 差量推送(Delta Push):仅发送位置/朝向/动画状态的变化(量化为 int16);
- 优先级队列:近距>视线内>战斗相关>远距低频;
- 节流与预算:每 Tick 为每订阅者设置字节预算(如 1–3KB);超过预算的对象推迟;
- 合帧与压缩:对同一订阅者合并多个对象更新;允许 LZ4/Zstd;
- 反压(Backpressure):如客户端 ACK 落后,降低 AOI 频率或扩大量化误差。
3.3 可见性裁剪
- 遮挡/视野可选(原型阶段可不做);
- 队内共享:队友之间共享被动雷达(队内图标始终广播)。
- 反外设:绝不下发未可见的敌方精确数据(仅大致枪声/脚步事件)。
4. 缩圈系统(Dynamic Safe Zone)
4.1 定义
- 安全区(White/Green Circle):中心
C_i、半径R_i; - 毒圈(Blue Zone):在安全区外的伤害区;
- 阶段(Phase i):
i = 1..N,每阶段包含:预告时间(展示下一安全区)、收缩时间(蓝圈移动/收缩)。
4.2 生成与收缩算法
-
初始圈:
C_0设为地图重心 ± 随机偏移;R_0覆盖全图 70–80%。 -
下一圈中心
C_{i+1}:- 在
Circle(C_i, R_i * α)内随机,避开大海/不可达区; - 结合存活玩家密度做轻微偏置(避免过早把人全部逼入海里)。
- 在
-
下一圈半径
R_{i+1} = R_i * β_i(β_i≈0.5–0.75,阶段性递减)。 -
预告:公布
C_{i+1}, R_{i+1},给T_announce秒准备。 -
收缩:蓝圈以速度
v_i = (R_i - R_{i+1}) / T_shrink_i向内移动。
参数曲线可用“阶段模板”:Phase1 慢大圈、Phase2–4 中速、Phase5+ 快收敛(3–5 分钟结束)。
4.3 伤害模型
- 外圈伤害:
dps_i = base_i + slope_i * t_outside(阶段递增,累积暴涨); - 治疗窗口:保证早期可通过药品抵消,后期不可。
- 载具互动:载具在圈外易受损;圈边碰撞/卡地形做容错滑移。
4.4 公平与反套路
- 随机性受种子控制(回放可重建);
- 圈中心不可落在不可达区域;
- 防“贴边无敌”:圈边缓冲宽度 ε,判定取实体外接半径;
- 断线保护:断线不暂停缩圈;玩家处于圈外仍会受伤。
5. 物理与战斗
5.1 移动与碰撞
- 角色/载具使用圆柱体碰撞体;地形使用高度图 + 三角网格;
- 服务器推进轻物理(运动学 + 简化摩擦/斜坡);客户端可做小幅预测,服务端权威校正。
5.2 射击与命中
-
命中判定在服务端:
- 弹道:Hitscan(直线 + 穿透/衰减)或投射体(抛物/烟雾/燃烧瓶);
- 延迟补偿:记录最近 200–300ms 的骨骼历史(Lag Compensation),在服务端回溯射线;
- 护甲:部位倍率;
- 倒地/复活:Squad 模式中被击倒(Knockdown)后可救援。
5.3 投掷物与爆炸
- 服务器模拟轨迹(重力/空气阻力可忽略);落地后生成体素/AOE 实体:烟雾体积、燃烧持续伤害、破片冲击波(半径与遮挡修正)。
5.4 载具
- 参数化动力学(最大速度/加速度/转弯半径/打滑系数);
- 碰撞伤害与耐久;车内上座位置与下车动画(服务器仅判定上车格与安全下车点)。
6. 出生、刷物与空投
- 航线与跳伞(可选简化为随机出生点,避免飞机/跳伞复杂度)。
- 战利品表(Loot Table):按区块权重随机;枪/配件/药品/盔甲/背包梯度。
- 空投:每阶段触发 0–2 次;抛物落点在安全区内;广播全局音效/信号。
- 补给箱:开箱具有交互时间,可被打断;战利品拾取使用权威锁避免并发冲突。
7. 状态同步与协议
7.1 客户端 → 服务器(UDP)
{ "t":"in", "seq":8123, "tick":20150, "uid":1001,
"move":[0.4,-0.1], "look":[-0.02,0.11],
"actions":{"shoot":1,"ads":0,"use":0,"throw":0},
"weapon":"m416","recoil_ack":332 }
7.2 服务器 → 客户端(AOI 增量)
{ "t":"st","tick":20150,"aoi":[
{"id":501,"p":[1234,678], "v":[2,-1], "yaw":512, "st":5}, // 玩家简状态
{"id":9001,"kind":"veh","p":[1300,680],"hp":720}, // 载具
{"id":30001,"kind":"nade","p":[1200,600],"ttl":1200} // 投掷物
], "circle": {"phase":3,"c":[2048,1536],"r":950,"eta":7300}, "ack":8123 }
7.3 可靠控制(WS)
- 匹配/准备/开始、复盘、观战、重连、背包管理、分解/丢弃、换枪、复活交互、治疗进度等。
7.4 数据量控制
- 位置/角度量化(厘米/千分度);
- AOI 节流 10–20Hz,近邻冲突(交战)可临时提升;
- 静态对象(树/房屋)不下发,客户端本地资源 + 稳定地图版本号。
8. 断线恢复与观战
8.1 恢复
- 客户端发送
last_ack_seq/tick; - 服务器返回最近关键帧(玩家自身 + 邻域 AOI + 圈状态)+ 事件补齐(从 last 到 now);
- 客户端对齐一致性哈希后切回实时;
- 若玩家已死亡:进入观战(队友优先视角)。
8.2 观战
- 服务器裁剪:观战者只能收到被观战对象的 AOI与公共信息(圈/空投/击杀播报);
- 延迟:公共观战流可加 10–30s 延迟以防代打透视。
9. 战斗日志与回放(Killfeed & Replay)
- 事件:
Spawn, Pickup, Drop, Shoot, Hit, Knockdown, Revive, Kill, VehicleHit, GrenadeExplode, CirclePhase, Airdrop, DeathCamStart/End - Death Cam:从受害者视角回放 5–10s;
- 赛后回放:全局事件 + 圈演变;可输出“热力图”(落点/击杀/移动)。
10. 反作弊与风控
| 风险 | 说明 | 防护 |
|---|---|---|
| 自瞄/透视 | 客户端非法获取敌方精确信息 | 服务器严格裁剪;命中服务端判定;可疑命中率模型告警 |
| 加速/瞬移 | 客户端时间篡改/速度异常 | 速度/加速度限幅;移动轨迹统计;超阈值即橡皮筋回拉 |
| 无后坐/连点 | 火控参数篡改 | 后坐在服务器端计算;射速冷却服务器校验 |
| 大弹匣/无后坐附件伪造 | 装备一致性校验 | 换枪/装配由服务器权威变更 |
| 破坏缩圈 | 客户端干预 | 缩圈由服务器单源 RNG + 时间表驱动 |
| 空投刷物 | 并发拾取 | 物品拾取加原子锁;账本式物品转移 |
11. 指标与监控
- 网络:
rtt, loss, jitter, goodput, aoi_push_bytes/s, pkt/sec - 服务器:
tick_ms p50/p95/p99, ecs_entities, aoi_subs, circle_phase_time, physics_ms - 对局:
avg_time_to_first_fight, avg_alive_curve, kills_per_min, revive_rate, vehicle_usage - 公平性:
lag_comp_correction_dist,headshot_rate_zscore,suspect_flag_rate - 体验:
reconnect_time_ms, deathcam_success_rate, airdrop_contest_ratio
12. 压测与测试
- AOI 压测:100/150/200 人、平均 30 个邻域实体,验证
aoi_push p95 < 10ms、总带宽 < 10 Mbps/房; - 缩圈节奏:仿真 1,000 局,结束时间分布收敛到目标(20–25min);
- 延迟补偿正确性:射击回溯误差 @ RTT 50/100/150ms < 15/25/35 cm;
- 投掷物/载具确定性:相同种子重放偏差 < 1 cm;
- 断线恢复:拔网线 10s → 3s 内回到实时;
- 反作弊回归:已知外挂指标检测召回率/误报率。
13. 数据结构(要点)
matches(id, map, seed, phase, tick, state)players(match_id, uid, team, alive, pos, inv, hp, armor)items(id, kind, attr, pos, owner)(地面与背包统一对象)vehicles(id, type, hp, fuel, pos, vel)circle(match_id, phase, c, r, eta)(时间线)events(match_id, seq, tick, kind, payload)snapshots(match_id, tick, blob_uri)(关键帧)
14. 客户端 UX 与可视化
- 小地图/罗盘:显示安全区、下一圈预告、空投落点、队友标记;
- 圈 UI:外圈蓝色墙,血量掉落提示;圈内/圈外明确对比;
- 信息层级:击杀播报、伤害数字(可开关)、载具燃油/耐久、物品稀有度颜色;
- 观战:切换队友/自由视角、慢动作 Death Cam、击杀回放时间轴。
15. 版本迭代路线
| 版本 | 目标 | 要点 |
|---|---|---|
| v0.1 | 基础房间 + AOI | 网格 AOI,移动/拾取/开火/命中,蓝圈静态 |
| v0.2 | 缩圈 | 多阶段圈,预告+收缩;蓝圈伤害曲线 |
| v0.3 | 投掷物/空投 | 投掷轨迹、烟/燃烧,空投逻辑与争夺 |
| v0.4 | 载具 | 皮卡/摩托参数化;载具伤害与上/下车 |
| v0.5 | 断线/观战/回放 | 快照恢复、Death Cam、赛后回放 |
| v1.0 | 稳定与反作弊 | 延迟补偿完善、外挂检测、指标看板与压测通过 |
16. MVP 勾选清单
- AOI 区域广播(网格订阅 + 差量推送 + 节流 + 优先级)
- 缩圈系统(阶段模板 + 预告/收缩 + 伤害曲线 + 种子可重建)
- 服务器权威战斗(命中回溯、投掷物/爆炸、基础载具)
- 事件溯源 + 关键帧快照 + 断线恢复
- 观战/Death Cam/赛后回放
- 反作弊与裁剪(只下发可见 + 参数权威校验)
- 压测脚本与指标看板