鱼饵争抢 / 1000 鱼
| 后端 | FPS | 1% Low | Sim ms | 重叠 | 最小间距 | MaxSpeed | 时长 |
|---|---|---|---|---|---|---|---|
| RVO2 | 2.7 | 0.9 | 71.1 | 856.8 | -0.698 | 16.8 | 767.6s |
| A Pro RVO | 13.6 | 5.2 | 54.2 | 1308.4 | -0.510 | 4.2 | 28.0s |
| A Pro VelocityLike | 14.3 | 6.1 | 54.6 | 1235.0 | -0.654 | 4.2 | 56.5s |
From 2bb4a83a12ef144bbf21ba70aa5d78fbea0afaf7 Mon Sep 17 00:00:00 2001 From: "JSD\\13999" <1399945104@qq.com> Date: Mon, 15 Jun 2026 17:14:26 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E8=AE=B0=E5=BD=95=20Android=5F3=20?= =?UTF-8?q?=E9=81=BF=E9=9A=9C=E5=A4=8D=E6=B5=8B=E7=BB=93=E8=AE=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...-pro-velocitylike-demo-integration-plan.md | 204 ++++++++++++++++++ ...ce-benchmark-report-20260615-android3.html | 30 +++ 2 files changed, 234 insertions(+) create mode 100644 FishROV/Docs/a-pro-velocitylike-demo-integration-plan.md create mode 100644 FishROV/Docs/avoidance-benchmark-report-20260615-android3.html 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 @@ +
2026-06-15 / 百元机 / XZ2D
本页分析 C:/Users/13999/Desktop/logs/android_3 下 24 个 CSV。统计时排除 timeSeconds=0 启动样本;同一组合多次运行时优先采用有效时长 ≥ 8 秒的最新 run。
| 后端 | FPS | 1% Low | Sim ms | 重叠 | 最小间距 | MaxSpeed | 时长 |
|---|---|---|---|---|---|---|---|
| RVO2 | 2.7 | 0.9 | 71.1 | 856.8 | -0.698 | 16.8 | 767.6s |
| A Pro RVO | 13.6 | 5.2 | 54.2 | 1308.4 | -0.510 | 4.2 | 28.0s |
| A Pro VelocityLike | 14.3 | 6.1 | 54.6 | 1235.0 | -0.654 | 4.2 | 56.5s |
| 后端 | FPS | 1% Low | Sim ms | 重叠 | 最小间距 | MaxSpeed | 时长 |
|---|---|---|---|---|---|---|---|
| RVO2 | 29.2 | 23.6 | 17.5 | 164.7 | -0.320 | 4.2 | 29.5s |
| A Pro RVO | 30.1 | 27.5 | 14.9 | 192.5 | -0.300 | 4.2 | 73.5s |
| A Pro VelocityLike | 30.1 | 24.2 | 14.9 | 206.2 | -0.215 | 4.2 | 34.0s |
| 后端 | FPS | 1% Low | Sim ms | 重叠 | 最小间距 | MaxSpeed | 时长 |
|---|---|---|---|---|---|---|---|
| RVO2 | 24.0 | 10.5 | 31.2 | 343.4 | -0.348 | 4.2 | 32.0s |
| A Pro RVO | 27.8 | 13.8 | 22.2 | 412.5 | -0.342 | 4.2 | 34.0s |
| A Pro VelocityLike | 27.1 | 12.3 | 23.3 | 450.8 | -0.431 | 4.2 | 32.0s |
| 后端 | FPS | 1% Low | Sim ms | 重叠 | 最小间距 | MaxSpeed | 时长 |
|---|---|---|---|---|---|---|---|
| RVO2 | 15.4 | 6.9 | 52.4 | 812.7 | -0.676 | 4.2 | 53.5s |
| A Pro RVO | 17.2 | 7.6 | 42.0 | 818.4 | -0.476 | 4.2 | 50.5s |
| A Pro VelocityLike | 17.6 | 7.6 | 41.6 | 854.2 | -0.478 | 4.2 | 51.0s |
| 后端 | FPS | 1% Low | Sim ms | 重叠 | 最小间距 | MaxSpeed | 时长 |
|---|---|---|---|---|---|---|---|
| RVO2 | 20.5 | 10.2 | 25.7 | 157.9 | -0.303 | 2.4 | 19.5s |
| A Pro RVO | 28.7 | 15.8 | 21.2 | 181.6 | -0.261 | 2.4 | 16.5s |
| A Pro VelocityLike | 29.1 | 16.3 | 23.2 | 226.3 | -0.386 | 2.4 | 26.0s |
| 后端 | FPS | 1% Low | Sim ms | 重叠 | 最小间距 | MaxSpeed | 时长 |
|---|---|---|---|---|---|---|---|
| RVO2 | 18.2 | 6.5 | 13.1 | 350.0 | -0.373 | 2.4 | 3.0s |
| 后端 | FPS | 1% Low | Sim ms | 重叠 | 最小间距 | MaxSpeed | 时长 |
|---|---|---|---|---|---|---|---|
| RVO2 | 22.5 | 11.8 | 29.0 | 257.2 | -0.496 | 2.4 | 77.5s |
| A Pro RVO | 22.3 | 17.0 | 20.8 | 509.3 | -0.497 | 2.4 | 524.5s |
| A Pro VelocityLike | 29.3 | 23.9 | 20.1 | 535.3 | -0.490 | 2.4 | 42.5s |
| 后端 | FPS | 1% Low | Sim ms | 重叠 | 最小间距 | MaxSpeed | 时长 |
|---|---|---|---|---|---|---|---|
| RVO2 | 16.0 | 5.6 | 62.1 | 775.6 | -0.693 | 2.4 | 40.5s |
| A Pro RVO | 16.0 | 7.1 | 46.2 | 752.5 | -0.580 | 2.4 | 32.5s |
| A Pro VelocityLike | 16.5 | 7.1 | 40.8 | 699.9 | -0.654 | 2.4 | 38.5s |
| 场景 | 鱼数 | 后端 | MaxSpeed | 样本 | 时长 | FPS | 1% Low | Sim ms | 重叠 | 最小间距 | 均速 | 均加速 | 文件 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 鱼饵争抢 | 300 | RVO2 | 4.2 | 59 | 29.5s | 29.2 | 23.6 | 17.5 | 164.7 | -0.320 | 1.4 | 2.3 | 20260615_161135_RVO2 本地避障_BaitScramble_XZ2D_300.csv |
| 鱼饵争抢 | 300 | A Pro RVO | 4.2 | 147 | 73.5s | 30.1 | 27.5 | 14.9 | 192.5 | -0.300 | 1.3 | 1.9 | 20260615_161206_A Pro RVO_BaitScramble_XZ2D_300.csv |
| 鱼饵争抢 | 300 | A Pro VelocityLike | 4.2 | 68 | 34.0s | 30.1 | 24.2 | 14.9 | 206.2 | -0.215 | 1.2 | 1.5 | 20260615_161319_A Pro RVO VelocityLike_BaitScramble_XZ2D_300.csv |
| 鱼饵争抢 | 500 | RVO2 | 4.2 | 64 | 32.0s | 24.0 | 10.5 | 31.2 | 343.4 | -0.348 | 1.3 | 1.9 | 20260615_161500_RVO2 本地避障_BaitScramble_XZ2D_500.csv |
| 鱼饵争抢 | 500 | A Pro RVO | 4.2 | 68 | 34.0s | 27.8 | 13.8 | 22.2 | 412.5 | -0.342 | 1.4 | 1.7 | 20260615_161426_A Pro RVO_BaitScramble_XZ2D_500.csv |
| 鱼饵争抢 | 500 | A Pro VelocityLike | 4.2 | 64 | 32.0s | 27.1 | 12.3 | 23.3 | 450.8 | -0.431 | 1.1 | 1.5 | 20260615_161353_A Pro RVO VelocityLike_BaitScramble_XZ2D_500.csv |
| 鱼饵争抢 | 800 | RVO2 | 4.2 | 107 | 53.5s | 15.4 | 6.9 | 52.4 | 812.7 | -0.676 | 1.2 | 2.0 | 20260615_161532_RVO2 本地避障_BaitScramble_XZ2D_800.csv |
| 鱼饵争抢 | 800 | A Pro RVO | 4.2 | 101 | 50.5s | 17.2 | 7.6 | 42.0 | 818.4 | -0.476 | 1.4 | 1.6 | 20260615_161626_A Pro RVO_BaitScramble_XZ2D_800.csv |
| 鱼饵争抢 | 800 | A Pro VelocityLike | 4.2 | 102 | 51.0s | 17.6 | 7.6 | 41.6 | 854.2 | -0.478 | 1.3 | 1.6 | 20260615_161717_A Pro RVO VelocityLike_BaitScramble_XZ2D_800.csv |
| 鱼饵争抢 | 1000 | RVO2 | 16.8 | 145 | 767.6s | 2.7 | 0.9 | 71.1 | 856.8 | -0.698 | 4.7 | 15.1 | 20260615_154502_RVO2 本地避障_BaitScramble_XZ2D_1000.csv |
| 鱼饵争抢 | 1000 | A Pro RVO | 4.2 | 56 | 28.0s | 13.6 | 5.2 | 54.2 | 1308.4 | -0.510 | 1.0 | 1.2 | 20260615_161905_A Pro RVO_BaitScramble_XZ2D_1000.csv |
| 鱼饵争抢 | 1000 | A Pro VelocityLike | 4.2 | 113 | 56.5s | 14.3 | 6.1 | 54.6 | 1235.0 | -0.654 | 1.1 | 1.4 | 20260615_161808_A Pro RVO VelocityLike_BaitScramble_XZ2D_1000.csv |
| 对向穿流 | 500 | RVO2 | 2.4 | 39 | 19.5s | 20.5 | 10.2 | 25.7 | 157.9 | -0.303 | 1.7 | 1.4 | 20260615_155751_RVO2 本地避障_CrossFlow_XZ2D_500.csv |
| 对向穿流 | 500 | A Pro RVO | 2.4 | 33 | 16.5s | 28.7 | 15.8 | 21.2 | 181.6 | -0.261 | 1.7 | 1.4 | 20260615_155811_A Pro RVO_CrossFlow_XZ2D_500.csv |
| 对向穿流 | 500 | A Pro VelocityLike | 2.4 | 52 | 26.0s | 29.1 | 16.3 | 23.2 | 226.3 | -0.386 | 1.4 | 1.4 | 20260615_155828_A Pro RVO VelocityLike_CrossFlow_XZ2D_500.csv |
| 圆阵高压 | 300 | RVO2 | 2.4 | 6 | 3.0s | 18.2 | 6.5 | 13.1 | 350.0 | -0.373 | 2.4 | 0.0 | 20260615_161132_RVO2 本地避障_DenseCircleStress_XZ2D_300.csv |
| 圆阵高压 | 500 | RVO2 | 2.4 | 155 | 77.5s | 22.5 | 11.8 | 29.0 | 257.2 | -0.496 | 1.0 | 1.2 | 20260615_160821_RVO2 本地避障_DenseCircleStress_XZ2D_500.csv |
| 圆阵高压 | 500 | A Pro RVO | 2.4 | 322 | 524.5s | 22.3 | 17.0 | 20.8 | 509.3 | -0.497 | 0.0 | 0.0 | 20260615_155937_A Pro RVO_DenseCircleStress_XZ2D_500.csv |
| 圆阵高压 | 500 | A Pro VelocityLike | 2.4 | 85 | 42.5s | 29.3 | 23.9 | 20.1 | 535.3 | -0.490 | 0.1 | 0.0 | 20260615_155854_A Pro RVO VelocityLike_DenseCircleStress_XZ2D_500.csv |
| 圆阵高压 | 800 | RVO2 | 2.4 | 81 | 40.5s | 16.0 | 5.6 | 62.1 | 775.6 | -0.693 | 1.2 | 1.3 | 20260615_160939_RVO2 本地避障_DenseCircleStress_XZ2D_800.csv |
| 圆阵高压 | 800 | A Pro RVO | 2.4 | 65 | 32.5s | 16.0 | 7.1 | 46.2 | 752.5 | -0.580 | 1.2 | 0.8 | 20260615_161020_A Pro RVO_DenseCircleStress_XZ2D_800.csv |
| 圆阵高压 | 800 | A Pro VelocityLike | 2.4 | 77 | 38.5s | 16.5 | 7.1 | 40.8 | 699.9 | -0.654 | 1.2 | 0.9 | 20260615_161053_A Pro RVO VelocityLike_DenseCircleStress_XZ2D_800.csv |
| 场景 | 鱼数 | 后端 | MaxSpeed | 样本 | 时长 | FPS | 文件 |
|---|---|---|---|---|---|---|---|
| 鱼饵争抢 | 500 | RVO2 | 4.2 | 2 | 1.0s | 0.3 | 20260615_155749_RVO2 本地避障_BaitScramble_XZ2D_500.csv |
| 圆阵高压 | 800 | RVO2 | 2.4 | 1 | 0.5s | 16.5 | 20260615_161132_RVO2 本地避障_DenseCircleStress_XZ2D_800.csv |