diff --git a/FishROV/Docs/a-pro-velocitylike-demo-integration-plan.md b/FishROV/Docs/a-pro-velocitylike-demo-integration-plan.md new file mode 100644 index 0000000..ceb9ec0 --- /dev/null +++ b/FishROV/Docs/a-pro-velocitylike-demo-integration-plan.md @@ -0,0 +1,204 @@ +# A Pro VelocityLike Demo 推进文档 + +## 当前决策 + +新的表现 demo 建议先采用: + +- 主后端:`AstarProRvoVelocityLikeAdapter` +- 计算维度:`XZ2D` +- 输入语义:业务层只输出 `preferredVelocity` +- 避障语义:adapter 内部把 `preferredVelocity` 映射成 A* Pro RVO 的近目标 +- 保留对照:`Rvo2Adapter`、`AstarProRvoAdapter`、`NoAvoidanceAdapter` + +这个选择不是因为 VelocityLike 已经解决了所有重叠问题,而是因为它把输入语义控制住了。后续如果要调表现,问题会更容易归因到参数、场景密度、鱼饵吸引力或 A Pro RVO 本身,而不是混在“远目标接法”里。 + +## 依据 + +Android 百元机复测中,A Pro 路线在 500 鱼以上已经表现出稳定性能优势: + +- `BaitScramble / 500`:VelocityLike 相对 RVO2,FPS 约 `+13.0%`,simulation ms 约 `-25.4%` +- `BaitScramble / 800`:VelocityLike 相对 RVO2,FPS 约 `+14.1%`,simulation ms 约 `-20.7%` +- `CrossFlow / 500`:VelocityLike 相对 RVO2,FPS 约 `+42.0%` +- `DenseCircleStress / 800`:VelocityLike 相对 RVO2,simulation ms 约 `-34.3%`,重叠约 `-9.8%` + +同时,避障质量还没有完全达标: + +- `BaitScramble / 300-800` 中,VelocityLike 的重叠数量通常高于 RVO2 +- `DenseCircleStress / 500` 是当前风险最高样本,VelocityLike 重叠约为 RVO2 的两倍 +- VelocityLike 只能证明“输入语义更干净”,不能单独证明 A Pro 的参数已经合适 + +因此,后续目标应从“继续证明性能路线”切换为“在真实 demo 中调表现”。 + +## 新 Demo 接入边界 + +### 业务层只能依赖的概念 + +业务或玩法代码只应该依赖这些概念: + +- 鱼当前位置 +- 鱼目标方向 +- 期望速度 `preferredVelocity` +- 最大速度 +- 碰撞/拥挤半径 +- 鱼群或鱼饵行为状态 + +业务层不应该直接调用: + +- `SimulatorBurst` +- A Pro `IAgent.SetTarget` +- A Pro `CalculatedTargetPoint` +- A Pro `CalculatedSpeed` +- RVO2-CS simulator API + +这些后端 API 必须继续封装在 adapter 里。 + +### 推荐接口形态 + +新 demo 可以沿用现有 benchmark 思路,保持类似边界: + +```csharp +public interface IFishAvoidanceAdapter +{ + void Initialize(FishAvoidanceProfile profile); + FishAvoidanceHandle CreateAgent(FishAgentSpawnInfo spawnInfo); + void SetPreferredVelocity(FishAvoidanceHandle handle, Vector3 preferredVelocity); + Vector3 TickAndGetResolvedVelocity(FishAvoidanceHandle handle, float deltaTime); + void RemoveAgent(FishAvoidanceHandle handle); +} +``` + +如果 demo 已经有自己的鱼控制器,不一定要完全照搬这个接口,但要保持同样原则:业务给“期望速度”,adapter 给“避障后速度”。 + +## 第一阶段目标 + +第一阶段只做可用表现,不追求极限压测漂亮。 + +优先覆盖: + +- 300 鱼:表现自然,不卡顿 +- 500 鱼:百元机可接受,鱼饵争抢不明显穿模 +- 800 鱼:可作为上限压力,但不要求所有场景完美 + +暂时不要让 `DenseCircleStress` 主导所有调参。它适合作为红线检查,不适合作为真实玩法的唯一目标。 + +## 参数调优顺序 + +每次只改一个变量,每次保留一组截图、视频或 CSV。 + +### 1. 先调场景输入 + +优先调这些,因为它们直接决定鱼是否被强行挤到一起: + +- 鱼饵吸引力 +- 鱼饵中心收缩半径 +- 到达鱼饵后的减速曲线 +- 鱼之间的目标方向扰动 +- 最大速度和加速度上限 + +建议先让鱼饵争抢不要持续把所有鱼压进同一个点。可以改成: + +- 靠近鱼饵后转为环绕 +- 每条鱼有不同停靠半径 +- 接近中心后降低 `preferredVelocity` +- 给鱼饵点周围加切向速度 + +### 2. 再调 A Pro RVO 参数 + +推荐按这个顺序试: + +| 参数 | 当前倾向 | 试验值 | +| --- | --- | --- | +| `MaxNeighbours` | 8 | 12 / 16 | +| `AgentTimeHorizon` | 2.5 | 3.5 / 4.5 | +| `ObstacleTimeHorizon` | 2.5 | 3.5 / 4.5 | +| agent radius | 当前鱼半径 | 视觉半径的 0.8 / 1.0 / 1.2 | +| priority | 0.2 | 按鱼状态分层 | + +注意:`MaxNeighbours` 和 `TimeHorizon` 可能改善质量,也可能增加 CPU 成本。每次调整都要上百元机确认。 + +### 3. 最后调视觉后处理 + +避障速度算出来之后,可以再加表现层平滑: + +- 转向平滑 +- 加速度限制 +- 动画朝向插值 +- 短距离分离修正 +- 模型之间的视觉避让偏移 + +这层只解决“看起来舒服”,不要用它掩盖严重重叠。 + +## 建议的 Demo 调试样本 + +不要再全量扫所有组合。真实 demo 推进时固定这几组: + +| 场景 | 鱼数 | 用途 | +| --- | ---: | --- | +| 鱼饵争抢 | 300 | 基础表现 | +| 鱼饵争抢 | 500 | 主要目标 | +| 鱼饵争抢 | 800 | 高压上限 | +| 对向穿流 | 500 | 正面对冲检查 | +| 圆阵高压 | 500 | 红线检查 | + +每组建议至少跑 20 秒,排除 `timeSeconds=0` 的启动样本。 + +## 验收标准 + +第一版 demo 可以按这个标准判断是否可继续: + +- 百元机 500 鱼:平均 FPS 不低于 RVO2,simulation ms 明显低于 RVO2 +- 百元机 500 鱼:鱼饵争抢没有大面积持续穿模 +- 300 鱼:鱼群运动自然,不出现明显卡顿、抽搐、急停 +- 800 鱼:允许轻微拥挤,但不能长时间塌缩成一个点 +- 圆阵高压 500:作为红线,如果重叠特别高,需要记录但不一定阻止 demo 推进 + +如果真实玩法主要是鱼饵争抢,`BaitScramble / 500` 的表现权重应高于 `DenseCircleStress`。 + +## 回退与替换成本 + +只要继续保持 adapter 隔离,后续更换成本不高。 + +低成本回退: + +- 切回 `Rvo2Adapter` +- 切回旧 `AstarProRvoAdapter` +- 新增另一个 A Pro adapter +- 保留 VelocityLike 但换参数 profile + +中等成本替换: + +- 换另一个本地避障库 +- 自己实现一个新的 CPU 求解器 +- 引入 ECS/Job 化的自研求解器 + +高成本替换: + +- 业务层直接依赖 A Pro API +- 场景逻辑专门迎合 A Pro 远目标行为 +- 鱼控制器和避障求解器写死在一起 +- 动画、目标、避障、碰撞统计共用同一套不可拆逻辑 + +因此,后续 demo 中最重要的工程原则是:不要让 A Pro API 泄漏到玩法层。 + +## 推荐落地步骤 + +1. 在新 demo 中接入 `AstarProRvoVelocityLikeAdapter` 或同语义 adapter。 +2. 建一个 `FishAvoidanceProfile`,集中放 `MaxNeighbours`、`TimeHorizon`、半径、优先级等参数。 +3. 让鱼控制器只输出 `preferredVelocity`,不要直接设置 A Pro target。 +4. 先跑 300 鱼,确认视觉自然。 +5. 再跑 500 鱼鱼饵争抢,把鱼饵吸引力和停靠半径调到不塌缩。 +6. 上百元机跑 500 鱼,记录 FPS、simulation ms、重叠和视频表现。 +7. 只在真实表现仍不行时,再调 `MaxNeighbours` 和 `TimeHorizon`。 +8. 保留 RVO2 一键切换,作为长期回归对照。 + +## 当前结论 + +可以开始在另一个 demo 里推进具体表现了。 + +建议主线是: + +```text +A Pro VelocityLike + XZ2D + adapter 隔离 + profile 参数化 +``` + +不要继续把时间花在证明 A Pro 是否有性能优势上。现在更有价值的是把真实玩法中的鱼饵吸引、停靠半径、速度曲线和 RVO 参数一起调到“看起来对”。 diff --git a/FishROV/Docs/avoidance-benchmark-report-20260615-android3.html b/FishROV/Docs/avoidance-benchmark-report-20260615-android3.html new file mode 100644 index 0000000..f45ad08 --- /dev/null +++ b/FishROV/Docs/avoidance-benchmark-report-20260615-android3.html @@ -0,0 +1,30 @@ +FishROV Android 3 避障复测报告

2026-06-15 / 百元机 / XZ2D

Android_3 A Pro VelocityLike 复测报告

本页分析 C:/Users/13999/Desktop/logs/android_3 下 24 个 CSV。统计时排除 timeSeconds=0 启动样本;同一组合多次运行时优先采用有效时长 ≥ 8 秒的最新 run。

CSV run24
采用 run22
干净对照组6
屏幕720x1600

结论

  • 这一批比 android_2 干净得多:主要对照已经固定在百元机、XZ2D、720x1600,并且大部分关键组合速度倍率一致、时长超过 20 秒。
  • 鱼饵 300:VelocityLike 相对 RVO2,FPS +3.1%、Sim ms -14.7%、重叠 +25.2%;相对旧 A Pro,FPS -0.3%、重叠 +7.1%。
  • 鱼饵 500:VelocityLike 相对 RVO2,FPS +13.0%、Sim ms -25.4%、重叠 +31.3%;相对旧 A Pro,FPS -2.6%、重叠 +9.3%。
  • 鱼饵 800:VelocityLike 相对 RVO2,FPS +14.1%、Sim ms -20.7%、重叠 +5.1%;相对旧 A Pro,FPS +2.6%、重叠 +4.4%。
  • 对向穿流 500:VelocityLike 相对 RVO2,FPS +42.0%、Sim ms -9.8%、重叠 +43.3%;相对旧 A Pro,FPS +1.4%、重叠 +24.6%。
  • 圆阵 500:VelocityLike 相对 RVO2,FPS +30.2%、Sim ms -30.7%、重叠 +108.1%;相对旧 A Pro,FPS +31.2%、重叠 +5.1%。
  • 圆阵 800:VelocityLike 相对 RVO2,FPS +3.3%、Sim ms -34.3%、重叠 -9.8%;相对旧 A Pro,FPS +3.2%、重叠 -7.0%。
  • 鱼饵 1000:两个 A Pro 可比,VelocityLike 比旧 A Pro FPS +4.8%、重叠 -5.6%;但 RVO2 这一轮 maxSpeed=16.8,不是同变量,不能纳入三方结论。
  • 总体判断:A Pro 的 Burst/Job 路线在 500+ 鱼时仍有明显性能优势;VelocityLike 并没有稳定降低“重叠数量”,但在鱼饵 300/800 和圆阵 800 上改善了最小间距或总体表现。圆阵 500 仍是最危险样本,A Pro 重叠约为 RVO2 的两倍。

样本质量

可以优先采信
  • 鱼饵争抢 / 300 鱼
  • 鱼饵争抢 / 500 鱼
  • 鱼饵争抢 / 800 鱼
  • 对向穿流 / 500 鱼
  • 圆阵高压 / 500 鱼
  • 圆阵高压 / 800 鱼
需要谨慎
  • 鱼饵争抢 / 1000 鱼:速度一致 不满足
  • 圆阵高压 / 300 鱼:三后端齐全、时长充足 不满足

控制变量对比

鱼饵争抢 / 1000 鱼

三后端齐全速度不一致时长充足
Velocity vs RVO2 FPS+429.7%
Velocity vs RVO2 Sim-23.2%
Velocity vs RVO2 重叠+44.1%
Velocity vs 旧 A Pro 重叠-5.6%
后端FPS1% LowSim ms重叠最小间距MaxSpeed时长
RVO22.70.971.1856.8-0.69816.8767.6s
A Pro RVO13.65.254.21308.4-0.5104.228.0s
A Pro VelocityLike14.36.154.61235.0-0.6544.256.5s
+

鱼饵争抢 / 300 鱼

三后端齐全速度一致时长充足
Velocity vs RVO2 FPS+3.1%
Velocity vs RVO2 Sim-14.7%
Velocity vs RVO2 重叠+25.2%
Velocity vs 旧 A Pro 重叠+7.1%
后端FPS1% LowSim ms重叠最小间距MaxSpeed时长
RVO229.223.617.5164.7-0.3204.229.5s
A Pro RVO30.127.514.9192.5-0.3004.273.5s
A Pro VelocityLike30.124.214.9206.2-0.2154.234.0s
+

鱼饵争抢 / 500 鱼

三后端齐全速度一致时长充足
Velocity vs RVO2 FPS+13.0%
Velocity vs RVO2 Sim-25.4%
Velocity vs RVO2 重叠+31.3%
Velocity vs 旧 A Pro 重叠+9.3%
后端FPS1% LowSim ms重叠最小间距MaxSpeed时长
RVO224.010.531.2343.4-0.3484.232.0s
A Pro RVO27.813.822.2412.5-0.3424.234.0s
A Pro VelocityLike27.112.323.3450.8-0.4314.232.0s
+

鱼饵争抢 / 800 鱼

三后端齐全速度一致时长充足
Velocity vs RVO2 FPS+14.1%
Velocity vs RVO2 Sim-20.7%
Velocity vs RVO2 重叠+5.1%
Velocity vs 旧 A Pro 重叠+4.4%
后端FPS1% LowSim ms重叠最小间距MaxSpeed时长
RVO215.46.952.4812.7-0.6764.253.5s
A Pro RVO17.27.642.0818.4-0.4764.250.5s
A Pro VelocityLike17.67.641.6854.2-0.4784.251.0s
+

对向穿流 / 500 鱼

三后端齐全速度一致时长充足
Velocity vs RVO2 FPS+42.0%
Velocity vs RVO2 Sim-9.8%
Velocity vs RVO2 重叠+43.3%
Velocity vs 旧 A Pro 重叠+24.6%
后端FPS1% LowSim ms重叠最小间距MaxSpeed时长
RVO220.510.225.7157.9-0.3032.419.5s
A Pro RVO28.715.821.2181.6-0.2612.416.5s
A Pro VelocityLike29.116.323.2226.3-0.3862.426.0s
+

圆阵高压 / 300 鱼

后端不齐速度一致时长偏短
Velocity vs RVO2 FPS
Velocity vs RVO2 Sim
Velocity vs RVO2 重叠
Velocity vs 旧 A Pro 重叠
后端FPS1% LowSim ms重叠最小间距MaxSpeed时长
RVO218.26.513.1350.0-0.3732.43.0s
+

圆阵高压 / 500 鱼

三后端齐全速度一致时长充足
Velocity vs RVO2 FPS+30.2%
Velocity vs RVO2 Sim-30.7%
Velocity vs RVO2 重叠+108.1%
Velocity vs 旧 A Pro 重叠+5.1%
后端FPS1% LowSim ms重叠最小间距MaxSpeed时长
RVO222.511.829.0257.2-0.4962.477.5s
A Pro RVO22.317.020.8509.3-0.4972.4524.5s
A Pro VelocityLike29.323.920.1535.3-0.4902.442.5s
+

圆阵高压 / 800 鱼

三后端齐全速度一致时长充足
Velocity vs RVO2 FPS+3.3%
Velocity vs RVO2 Sim-34.3%
Velocity vs RVO2 重叠-9.8%
Velocity vs 旧 A Pro 重叠-7.0%
后端FPS1% LowSim ms重叠最小间距MaxSpeed时长
RVO216.05.662.1775.6-0.6932.440.5s
A Pro RVO16.07.146.2752.5-0.5802.432.5s
A Pro VelocityLike16.57.140.8699.9-0.6542.438.5s

采用数据

+ + + + + + + + + + + + + + + + + + + + +
场景鱼数后端MaxSpeed样本时长FPS1% LowSim ms重叠最小间距均速均加速文件
鱼饵争抢300RVO24.25929.5s29.223.617.5164.7-0.3201.42.320260615_161135_RVO2 本地避障_BaitScramble_XZ2D_300.csv
鱼饵争抢300A Pro RVO4.214773.5s30.127.514.9192.5-0.3001.31.920260615_161206_A Pro RVO_BaitScramble_XZ2D_300.csv
鱼饵争抢300A Pro VelocityLike4.26834.0s30.124.214.9206.2-0.2151.21.520260615_161319_A Pro RVO VelocityLike_BaitScramble_XZ2D_300.csv
鱼饵争抢500RVO24.26432.0s24.010.531.2343.4-0.3481.31.920260615_161500_RVO2 本地避障_BaitScramble_XZ2D_500.csv
鱼饵争抢500A Pro RVO4.26834.0s27.813.822.2412.5-0.3421.41.720260615_161426_A Pro RVO_BaitScramble_XZ2D_500.csv
鱼饵争抢500A Pro VelocityLike4.26432.0s27.112.323.3450.8-0.4311.11.520260615_161353_A Pro RVO VelocityLike_BaitScramble_XZ2D_500.csv
鱼饵争抢800RVO24.210753.5s15.46.952.4812.7-0.6761.22.020260615_161532_RVO2 本地避障_BaitScramble_XZ2D_800.csv
鱼饵争抢800A Pro RVO4.210150.5s17.27.642.0818.4-0.4761.41.620260615_161626_A Pro RVO_BaitScramble_XZ2D_800.csv
鱼饵争抢800A Pro VelocityLike4.210251.0s17.67.641.6854.2-0.4781.31.620260615_161717_A Pro RVO VelocityLike_BaitScramble_XZ2D_800.csv
鱼饵争抢1000RVO216.8145767.6s2.70.971.1856.8-0.6984.715.120260615_154502_RVO2 本地避障_BaitScramble_XZ2D_1000.csv
鱼饵争抢1000A Pro RVO4.25628.0s13.65.254.21308.4-0.5101.01.220260615_161905_A Pro RVO_BaitScramble_XZ2D_1000.csv
鱼饵争抢1000A Pro VelocityLike4.211356.5s14.36.154.61235.0-0.6541.11.420260615_161808_A Pro RVO VelocityLike_BaitScramble_XZ2D_1000.csv
对向穿流500RVO22.43919.5s20.510.225.7157.9-0.3031.71.420260615_155751_RVO2 本地避障_CrossFlow_XZ2D_500.csv
对向穿流500A Pro RVO2.43316.5s28.715.821.2181.6-0.2611.71.420260615_155811_A Pro RVO_CrossFlow_XZ2D_500.csv
对向穿流500A Pro VelocityLike2.45226.0s29.116.323.2226.3-0.3861.41.420260615_155828_A Pro RVO VelocityLike_CrossFlow_XZ2D_500.csv
圆阵高压300RVO22.463.0s18.26.513.1350.0-0.3732.40.020260615_161132_RVO2 本地避障_DenseCircleStress_XZ2D_300.csv
圆阵高压500RVO22.415577.5s22.511.829.0257.2-0.4961.01.220260615_160821_RVO2 本地避障_DenseCircleStress_XZ2D_500.csv
圆阵高压500A Pro RVO2.4322524.5s22.317.020.8509.3-0.4970.00.020260615_155937_A Pro RVO_DenseCircleStress_XZ2D_500.csv
圆阵高压500A Pro VelocityLike2.48542.5s29.323.920.1535.3-0.4900.10.020260615_155854_A Pro RVO VelocityLike_DenseCircleStress_XZ2D_500.csv
圆阵高压800RVO22.48140.5s16.05.662.1775.6-0.6931.21.320260615_160939_RVO2 本地避障_DenseCircleStress_XZ2D_800.csv
圆阵高压800A Pro RVO2.46532.5s16.07.146.2752.5-0.5801.20.820260615_161020_A Pro RVO_DenseCircleStress_XZ2D_800.csv
圆阵高压800A Pro VelocityLike2.47738.5s16.57.140.8699.9-0.6541.20.920260615_161053_A Pro RVO VelocityLike_DenseCircleStress_XZ2D_800.csv

剔除/重复 run

+
场景鱼数后端MaxSpeed样本时长FPS文件
鱼饵争抢500RVO24.221.0s0.320260615_155749_RVO2 本地避障_BaitScramble_XZ2D_500.csv
圆阵高压800RVO22.410.5s16.520260615_161132_RVO2 本地避障_DenseCircleStress_XZ2D_800.csv

下一步

  • 补一个同速度的 RVO2 / BaitScramble / 1000 / maxSpeed 4.2,这样 1000 鱼三后端才能闭环。
  • 如果要降低重叠,下一步不要只换输入语义;要开始调 A Pro 的邻居数、time horizon、半径/拥挤密度,尤其是圆阵 500。
  • 就性能路线看,A Pro 可以继续推进;就避障质量看,VelocityLike 不能单独证明 A Pro 已经达标。
\ No newline at end of file