# P1.5 Simulation 收尾说明(P2 输入基线) ## 测试设备与环境 - 设备:iQOO Neo8 - CPU:第一代骁龙 8+ 八核 - 内存:12 GB - 系统:OriginOS 6(Android 16) - Unity Profiler 口径:以 CPU `ms` 为主,`fps` 仅作辅助(Android 端 60 fps 上限) - Profiler 配置:`Call Stacks = Off`(开启会额外放大 CPU 开销,不纳入本次基线) ## CPU 分阶段数据(P1.5) | 怪物数量 | 帧率 | MoveSeperation 占比 | BuildInput 占比 | WriteBack 占比 | StateUpdate 占比 | |--------|---------------------|--------------------|------------------|------------------|------------------| | `500` | `60 fps (16.56 ms)` | `25.8% (4.28 ms)` | `1.2% (0.20 ms)` | `1.0% (0.17 ms)` | `0.7% (0.12 ms)` | | `1000` | `44 fps (22.77 ms)` | `38.9% (8.86 ms)` | `1.8% (0.41 ms)` | `1.5% (0.36 ms)` | `1.0% (0.23 ms)` | | `1500` | `33 fps (29.83 ms)` | `46.7% (13.95 ms)` | `2.0% (0.61 ms)` | `1.7% (0.51 ms)` | `1.1% (0.35 ms)` | | `2000` | `19 fps (53.04 ms)` | `43.1% (19.53 ms)` | `2.1% (0.97 ms)` | `1.5% (0.69 ms)` | `1.0% (0.49 ms)` | ## Memory 对比(P1 -> P1.5) | 怪物数量 | GC Used Memory | GC Allocated In Frame | TickEnemies GC | |--------|------------------|-----------------------|-----------------| | `500` | `7.8 -> 7.9 MB` | `29.5 -> 2.1 KB` | `27.4 -> 0 KB` | | `1000` | `8.8 -> 8.8 MB` | `56.6 -> 2.1 KB` | `54.5 -> 0 KB` | | `1500` | `10.0 -> 9.0 MB` | `84.2 -> 2.1 KB` | `82.1 -> 0 KB` | | `2000` | `11.8 -> 9.9 MB` | `109.7 -> 2.1 KB` | `107.6 -> 0 KB` | ## CPU 热路径对比(P1 -> P1.5) 说明:P1.5 的 `TickEnemies` 以四阶段总和近似对齐 P1 的 `TickEnemies ms`。 | 怪物数量 | P1 TickEnemies | P1.5 四阶段合计 | 降幅 | |--------|----------------|------------|----------| | `500` | `6.18 ms` | `4.77 ms` | `-22.8%` | | `1000` | `12.80 ms` | `9.86 ms` | `-23.0%` | | `1500` | `20.11 ms` | `15.42 ms` | `-23.3%` | | `2000` | `29.62 ms` | `21.68 ms` | `-26.8%` | ## 结论(Checkpoint 6) - GC 目标达成:`TickEnemies GC` 在 `500~2000` 敌人数下均为 `0 KB`,满足 `< 5 KB/frame` 目标。 - CPU 阶段可观测性达成:`BuildInput -> Move/Separation -> StateUpdate -> WriteBack` 已可稳定采样。 - 当前主瓶颈明确:`MoveSeperation` 是绝对热点(约 `43%~47%` 帧占比),P2 优先并行化该阶段。 - 评估口径可复现:Android 端受 `60 fps` 上限影响,性能判断以 CPU `ms` 为准。 ## 回滚开关说明 - 开关字段:`SimulationWorld._useSimulationMovement`(序列化私有字段) - 对外接口:`UseSimulationMovement` / `SetUseSimulationMovement(bool)` - 回滚方式:将开关置 `false`,敌人立即回退到旧 `MovementComponent` 更新路径。 - 验证建议:同场景同刷怪参数下执行 A/B 对比,确认行为一致与性能差异。 ## P2 交接建议 - Job/Burst 第一优先级:`MoveSeperation` 阶段并行化。 - 保持阶段边界不变:继续维持四阶段管线与 `ProfilerMarker`,避免失去对比口径。 - 保持生命周期/索引规则不变:`EntitySync` 与 swap-back/remap 继续作为硬约束。