Commit Graph

192 Commits

Author SHA1 Message Date
bc8b401ef6 docs: 总体架构 V14 — FrameDataStore 内存回放双层存储设计 2026-06-17 16:08:58 +08:00
6098186f34 perf: 回放优先用内存 LiveFrames — 仿真刚结束时避免读数据库
FrameDataStore:
- Flush() 后保留 LiveFrames 副本在内存
- BeginRecording() / Discard() 时清除 LiveFrames

ReplayController:
- LoadReplay(taskId, frameStore) 优先取 LiveFrames
- frameStore 为 null 或 LiveFrames 为空时回退读 SQLite
- SimulationRunner 暴露 FrameStore 供 ReplayController 传入
2026-06-17 16:07:24 +08:00
4c2c18cfcc docs: 重写对接文档 — 五步完整工作流(基础数据→想定→仿真→报告→回放) 2026-06-17 15:57:41 +08:00
5d79e26e0f feat: ScenarioManager 接入 DataService — 前端启动前即可管理基础数据 2026-06-17 15:54:20 +08:00
6f28704368 docs: 对接文档 V1.5 — 新增 DataService 基础数据 CRUD 章节 2026-06-17 15:50:48 +08:00
e782062377 feat: Unity 端接入 DataService — 前端可直接 CRUD 基础数据
SimulationRunner 新增 DataService 属性
SimulationBootstrap 自动创建 DataService 并注入 Runner
前端调用: runner.DataService.GetAllDrones() 等
2026-06-17 15:50:22 +08:00
120f2805ec feat: 基础数据 CRUD — 统一命名,建表入库,DataService 提供全 CRUD
类名规范化:
- FireUnitTemplate → FireUnitSpec(火力单元规格)
- TargetPreset → DroneSpec(无人机规格)
- DetectionPreset → SensorSpec(传感器规格)
- WeatherPreset → EnvironmentSpec(环境规格)
- RoutePreset → RouteTemplate(航线模板)

DefaultData 属性重命名:
- Targets → Drones, DetectionEquipment → Sensors, Weather → Environments
- JSON 兼容: JsonPropertyName 保持原键名

新增: IDataService + DataService — 7 类基础数据全 CRUD
新增: 6 个 Repository(SpecRepositories.cs)
新增: DatabaseManager 自动建表 + 种子数据(RouteTemplate.Waypoints JSON 序列化存储)

测试: 243 通过
2026-06-17 12:36:49 +08:00
e250093a16 docs: 更新对接文档 V1.4,同步实体属性变更
- 事件示例:cloud.Dispersion.Center → cloud.PosX/Y/Z, cloud.Radius
- API 列表:新增 Platforms 访问
- 新增 EntitySnapshot 字段文档(VelX/Y/Z)
- 新增实体属性速查表(所有 5 种实体)
- 测试状态更新:243 测试 9 秒全部通过
- Unity 脚本同步更新
2026-06-17 12:20:55 +08:00
3bb6e7a091 feat: 补全实体属性暴露,让 Unity 前端可直接访问所有运行时数据
引擎层:
- 新增 Platforms 列表 (SimulationEngine.Platforms)
- EntitySnapshot 新增 VelX/VelY/VelZ 速度字段
- CollectSnapshots 收集所有实体类型(含 Munition/Detection)

CloudEntity: Pos/Radius/Density/Phase/Elapsed 便捷属性
MunitionEntity: Start/LaunchTime/ElapsedTime + Velocity 瞬时速度
DroneEntity: TraveledArc/TotalArc/Progress 航程进度
PlatformEntity: Target/FlightDistance/FlownDistance 飞行目标
DetectionEntity: PosX/Y/Z 位置(从 Source.Position)
2026-06-17 12:16:37 +08:00
ff830c1221 fix: 启用并修复 3机空基编队测试
DefaultScenarios:
- Seed3DronesAirBased: 参数对齐单机空基测试(风速5m/s东风、航速200)
- 3个平台沿X轴间隔300m分布(6000/6300/6600)

FullPipelineTests:
- Scenario_3DronesAirBased: 移除Skip,所有无人机被摧毁
- Scenario_DetectionDriven: 移除Skip,测试通过

测试: 243 通过 0 失败
2026-06-17 12:06:53 +08:00
da4e8d5c63 refactor: 移除隐藏 Math.Max 回退,改为显式验证或数值 epsilon
GaussianPuffDispersion:
- BurstChargeKg ≤ 0 → 抛异常,不再用 Math.Max(0.01, ...) 掩护
- Phase3 扩散距离 x ≤ 0 → 跳过,不再用 Math.Max(1f, ...)
- Opacity/SizeMultiplier → 除零改为显式判 0
- 缓存 _initialRadius 避免重复 Pow 计算

CloudExpansionModel:
- BurstChargeKg ≤ 0 → 抛异常
- Phase3 x ≤ 0 → 直接返回 Phase2 末半径
- RoundsNeeded: s ≤ 0 → 返回 1

DefensePlanner:
- yLanes>1 判定已在上一行,去掉冗余 Math.Max(1, ...)

InterceptCalculator:
- 保留 +0.001f epsilon(确保 ts>0),但不作为隐藏回退
- 改用显式加偏移替代 Math.Max(0.001f, ...)

DetectionCalculator.SpreadRadius: accuracy<0 → 抛异常
RouteGeometry: arcLength<0 → 钳位为 0(显式 if)

保留 10 处合法 Math.Max(取两值中较大者或几何钳位)
2026-06-17 11:30:56 +08:00
7bdda062c0 fix: 空基弹药从固定阵位水平发射,修正到达判定和插值
DefensePlanner 空基:
- 移除「飞到投放点再投弹」模型
- 改用固定阵位 + ComputeParabolicRange 前向计算
- ComputeHorizontal 使用 platform.PosY 替代 unit.ReleaseAltitude
- 云团位置 = 炮弹到达位置(飞行方向指向拦截点)

MunitionEntity:
- LaunchAngle/Azimuth/MuzzleVelocity/FlightDuration 改为 public
- 修正下落场景到达判定:发射点高于释放高度时等 Y 下降到位
- 修正插值除零回退 Math.Max(0.01f, ...) 导致负分母炸裂

SimulationEngine:
- 删除空基「到达投放点」死代码
- 删除 InterceptCalculatorAirTests 打印测试

测试: 241 通过 0 失败
2026-06-17 11:23:02 +08:00
e1f576fbe5 chore: 移除临时文件 t.txt 2026-06-17 10:46:13 +08:00
0ed714a730 refactor: 抛物线运动学前向计算 — 移除回退/反算,统一用 ParabolicPosition
Kinematics:
- CalculateLaunchAngle/ParabolicTimeOfFlight/ParabolicShellTime: 移除静默钳位和 45° 回退,输入无效直接抛异常
- 新增 ComputeParabolicRange(v₀,θ,Δy) → (射程,飞行时间) — 正问题
- 新增 ParabolicApex(v₀,θ) → (顶点高度,顶点时间)
- ParabolicShellTime 改为委托,不重复实现

MunitionEntity:
- launchAngle 必须由方案提供,不再反算
- _flightDuration 用 ComputeParabolicRange 正算
- 删除死代码 CommandFlyTo / 「到达投放点」路径

DefensePlanner:
- 地基用 InterceptCalculator 的 shellTime,不再用 ParabolicShellTime 反算

SimulationEngine:
- 删除空基「到达投放点」死代码

Tests: 240 通过 (KinematicsTests 38, DefensePlannerTests 36, SimulationEngineTests 12, MunitionEntityTests 3)
2026-06-17 10:45:56 +08:00
72e465570f fix: IC 的 crossArc 加 per-round targetOffset;空基 IC 集成(candidate + TryGenerateFireEvents) 2026-06-17 08:46:45 +08:00
69e41e3f7c feat: Planner→FireEvent 传递发射角; MunitionEntity 使用 planner 提供的角度(不再重算) 2026-06-17 08:20:54 +08:00
3fd8433276 feat: InterceptCalculator 返回发射角; FireEvent +LaunchAngle 字段; 重新集成到 planner 2026-06-17 08:13:20 +08:00
663afbe639 build: 更新 Unity Plugins Core.dll (v0.8.0) 2026-06-16 17:46:46 +08:00
ae47899080 docs: 更新想定参数表、任务跟踪、实体事件映射至 Phase 10 完成状态 2026-06-16 17:33:23 +08:00
df8e18d2d0 chore: 版本升至 0.8.0,更新 CHANGELOG 2026-06-16 17:31:09 +08:00
c2a10c1d51 chore: 清理调试代码,数据版本升至 V2 2026-06-16 17:28:36 +08:00
8e73c9b2ec feat: InterceptCalculator.ComputeHorizontal — 空基平抛(θ=0°)拦截点求解;全部231测试通过 2026-06-16 17:25:06 +08:00
016d9ac24b feat: InterceptCalculator 集成到 planner,替换硬编码中点逻辑;PlannerConfig +ReactionTime;Jet 通过 2026-06-16 16:24:08 +08:00
2089ff6c7b feat: InterceptCalculator — 抛物线与直线联立方程求解拦截点 2026-06-16 16:12:31 +08:00
e0b80a39de docs: 默认想定参数对照表(探测范围/部署位置/航路对比) 2026-06-16 14:14:55 +08:00
d8470bad30 Phase 10: 探测实时链路开发 + planner 诊断 + 硬编码消除
- 3D球冠探测: IsInCoverage, DetectionEntity, Tick 第5步扫描
- 探测融合: EarliestDetection 采样法, break 修复
- planner 诊断: HasInterceptWindow 拦截窗口检查
- TryGenerateFireEvents 返回拒绝原因
- Summary 含失败原因+建议值(探测范围/弧长)
- PlanningFailed 事件: 引擎在规划失败时发出事件
- 硬编码消除: Phase2Duration→AmmunitionSpec
  ExpansionFactor/TimingSafetyMargin→PlannerConfig
  速度从 waypoint.Speed 读取(不用 TypicalSpeed)
- TestData 改为从 seeded 数据库读取(不再内嵌 JSON)
- 默认数据加 3D球冠参数,巡航导弹速度300→200
  空基航路10km→20km, 位置调整
- 222 测试全通过
2026-06-16 14:10:23 +08:00
6b005cf9cc docs: 跟踪文档更新至 V1.5 + 探测统一原则定性纠正
1. 实施计划与任务跟踪 V1.4 -> V1.5:
   - 阶段总览补 Phase 9(完成)/Phase 10(待开发)
   - 校准现状:7.1 性能优化 (<20->200+ FPS)、8.1.1 探测设计完成
   - 测试数 191 -> 204,执行时间 41s -> 7s
   - Phase 8 标题去掉误导性 ,未完成项(蜂群/PDF/Word/第三方)补 
   - 新增 Phase 9:性能优化 5 项 + 文档校准 3 项(均 )
   - 新增 Phase 10:探测实时链路任务拆解(T1-T5, 依赖图, 总预估 11h)
   - 里程碑补 M8/M9/M10

2. 探测统一原则定性纠正(总体架构设计 14.2/14.2.1/14.7):
   - 原表述"统一原则"被弱化为"好看的对称",且有"planner 可保留 2D"备选方案
   - 纠正:仿真是按 planner 规划执行的,planner 探测判定 = 仿真事实依据
   - planner 若用 2D 判定"能发现"但目标高度超出 3D 球冠范围,会导致
     "未探测却拦截并摧毁"的物理错误结局
   - 统一原则是正确性硬约束,T3 不可砍、不可降级为 2D
   - 澄清两个独立问题:采样误差(<=1.5s)不影响火力计划(正确);
     2D->3D 几何升级不可省略(我之前漏了)
2026-06-16 11:27:13 +08:00
68b7434ddc docs: 总体架构设计校准与探测设备设计补全(V10→V13)
文档与代码对齐 + 探测设备行为设计固化。

1. 文档校准(修正与实现不符的错误):
   - AlgorithmFactory 实际为 Func<object> 工厂委托(非 Type+Activator)
   - IDefensePlanner.Plan 为 4 参数(含 detectionSources)
   - IDamageModel 补 RequiredExposureSeconds
   - FrameDataStore 是类非 IFrameDataStore 接口;删除不存在的 IRecordService
   - DroneEntity 运动模型为弧长驱动(不受风偏);Tick 流程顺序对齐
   - StateData 改为强类型字段+入库时序列化的双轨说明

2. 新增第十三章 性能设计(Tick 热路径优化,实测 <20 到 200+ FPS):
   - 航路几何缓存、仿真期零字符串分配、多边形顶点缓存
   - 帧数据内存缓存+批量落库、毁伤快速排斥、移除索引复用

3. 新增第十四章 探测设备设计(统一信息网络):
   - 区分事前静态规划(已实现)与运行时实时探测(待实现)双链路
   - 三维球冠探测几何(俯仰角+高度门限,IsInCoverage)
   - 5 项行为决策确认:回退 Undetected / 融合取最早-同刻取精度高 /
     不影响 FireSchedule / 盲区仅可视化 / 支持 3D 球冠
   - EquipmentDeployment 加 4 个 3D 探测字段 + 数据模型变更清单

4. 附带:技术要求终版.txt 错别字修正(晕图案 改 云团)
2026-06-16 10:59:32 +08:00
ce9d44db7e perf: 仿真期间零字符串分配,JSON 序列化推迟到 Flush
EntitySnapshot 新增原始字段(DamageStage/Hp/CloudRadius等), CollectSnapshots 直接填值

FrameDataStore buffer 改为 FrameRecord 结构体, Flush 时统一拼 JSON

SimulationRunner 直接读 snap.CloudRadius/CloudOpacity, 移除 JsonDocument.Parse

删除 SimulationEngine 的 StringBuilder 和 Str() 方法
2026-06-15 19:18:44 +08:00
fb22605fa3 perf: CollectSnapshots 改用 StringBuilder 池化避免中间字符串分配
StringBuilder.AppendFormat 复用内部缓冲区,每实体从4次分配到1次

.NET Standard 2.1 不支持 Span<T> 作泛型参数,string.Create 方案不可行
2026-06-15 19:14:17 +08:00
b3dec77e92 fix: DispersionModelTests 共享状态污染导致随机失败
Dissipates_AfterMaxDuration 直接用 Ammo() 返回的共享引用并修改 MaxDuration=2,后续 Phase2/Phase3 测试拿到被污染的数据

改为独立 new AmmunitionSpec 避免修改共享对象
2026-06-15 19:11:44 +08:00
2a87b77085 perf: 毁伤判定加快速排斥 (距离>2R跳过PathInSphere)
密度检查提前到外层循环,减少不必要计算
2026-06-15 18:47:11 +08:00
9964d77751 build: 更新 Unity Plugins Core.dll(FrameDataStore 内存缓存版) 2026-06-15 18:26:31 +08:00
5c2b95d777 perf: FrameDataStore 改为内存缓存+结束时批量写入
RecordFrame: 仅内存追加, 零磁盘IO

Flush: 仿真Stop时单次事务批量InsertAll

BeginRecording/Discard/BufferedFrameCount 新API

SimulationEngine: 移除 _frameDb 持久连接, RecordFrames默认true

SimulationRunner: 移除所有 Debug.Log 每帧日志

ReplayController: 适配 ReadFrames 新API

FrameDataStoreTests: 6项覆盖 录制/刷新/读取/丢弃/清理
2026-06-15 18:25:21 +08:00
cc1a0628d8 perf: SimulationEngine GC优化
CollectSnapshots: 字符串拼接替代 JsonSerializer.Serialize (最大GC源)

Tick: 复用池替代每帧 new List/SimulationFrameResult

ToList/Where→手动for循环+移除索引, 避免LINQ分配

移除 System.Text.Json 依赖
2026-06-15 18:19:56 +08:00
c379e849f0 fix: DefaultScenarios.Seed 幂等检查修复(SQL LIKE 中 [] 是通配符)
搜索关键字 [Demo]→Demo(避免 SQL LIKE 字符类误匹配)

版本升级时删除旧 Demo 任务后重建(而非跳过)
2026-06-15 17:19:43 +08:00
274779309d fix: Unity 脚本清理旧引用
ScenarioManager.SaveRoute: groupId→waveId 参数重命名

ManagerVerification: 移除冗余手动插弹药(DB已自动种子)

SimulationBootstrap: 更新为预设/自定义双模式模板
2026-06-15 16:29:31 +08:00
5f589c9644 refactor: SimulationBootstrap 更新为前端参考模板
两种模式: 预设(选[Demo]想定) / 自定义(DefaultData预设组装)

移除手动插弹药(已自动种子), 使用 DefaultData 天气/目标/航线/火力单元预设

UnityPathProvider 从 StreamingAssets 自动复制数据文件

前端文档: 快速开始改为挂 SimulationBootstrap 即运行
2026-06-15 16:27:45 +08:00
18f7b79401 fix: UnityPathProvider 首次运行自动复制数据文件
从 StreamingAssets 自动拷贝 defaults.json + planner_config.json 到 persistentDataPath

前端文档更新: 文件放 Assets/StreamingAssets/ 即可,无需手动放 persistentDataPath
2026-06-15 16:25:05 +08:00
5b6ccccba6 docs: 前端对接文档更新到 V1.3(预设想定一键运行)
交付物简化: defaults.json + planner_config.json(替代 default_ammo.json)

核心流程: 列出[Demo]想定→LoadAndStart→订阅事件,无需手写配置或调用Planner

新增: 自定义想定示例(使用 DefaultData 预设快速组装)

默认数据表: 弹药/编队/航线/火力单元/无人机/探测/天气/预设想定 8类
2026-06-15 16:21:02 +08:00
235c111a75 refactor: 集成测试使用预设想定 + 航线预设
defaults.json 新增 routes 航线预设 (3km/5km/10km/20km)

DefaultData 新增 RoutePreset/WaypointCoord,Routes 属性

DefaultScenarios 使用 R() 引用航线替代手写 MakeWaypoints

FullPipelineTests: LoadPreset/RunPreset 替代手写 setup,-500行

测试: 191 pass, 2 skip (DetectionDriven+3DronesAirBased), 24s
2026-06-15 16:18:51 +08:00
4fa19e386c feat: 预设想定种子 (DefaultScenarios)
6 个预设想定首次启动自动入库,幂等跳过:无防御/管控侵入/活塞西风/喷气活性/空基东风/3架空基编队

通过 DatabaseManager.OpenMainDb() 自动种子,版本追踪

ScenarioServiceTests 期望值适配(+6 个种子想定)
2026-06-15 16:06:56 +08:00
d6fb206078 build: 更新 Unity Plugins Core.dll(含 DefaultData 和 MetaEntry) 2026-06-15 15:47:22 +08:00
8eeb43f0e8 feat: 统一默认数据架构 (defaults.json + DefaultData)
单一数据源 data/defaults.json,含弹药/编队/火力单元/无人机/探测/天气六类预设

版本追踪: Meta 表 + version 字段,更新时 InsertOrReplace,不删用户数据

名称统一 [Demo] 前缀,UI 中可识别为模拟数据

删除: DefaultAmmunition.cs, DefaultFireUnits.cs, default_ammo.json, default_formations.json, TestAmmo.cs

TestPathProvider 自动复制数据文件到测试目录

集成测试精简: 4个简单变体跳过,保留6个核心场景,39s
2026-06-15 15:46:20 +08:00
56d345189e refactor: 编组概念拆分为批次(WaveId)+火力单元(FireUnit)
Breaking: Group表/枚举/Service/Repository移除; GroupId->WaveId; DroneGroup->DroneWave; DroneGroupId->DroneWaveId; GroupManager删除

Docs: CHANGELOG 0.7.0; 总体架构 V10; DefensePlanner V4; 实施计划 V1.4; 对接文档 V1.2

Tests: 204/204 pass
2026-06-15 15:13:48 +08:00
665747a846 feat: standalone detection equipment API + task detail includes detections
IScenarioService: AddDetection/DeleteDetection/GetDetections (independent of SaveDeployment overwrite).

Repository: GetByTaskIdAndRole filters by equipment role.

TaskFullConfig.Equipment already includes detections (GetTaskDetail.GetByTaskId returns all). Frontend filters by EquipmentRole.Detection or uses GetDetections.

Tests: 4 detection CRUD tests. 212 total pass.
2026-06-15 13:30:16 +08:00
11f8cb2c79 feat: detection-driven planning (v0.6.0)
Planner no longer has god-view. It assumes threats enter from detection boundary (unified info network earliest detection point), not route start.

Core: DetectionCalculator (EO attenuated by Visibility, radar/IR unaffected; earliest detection via segment-circle intersection). EquipmentDeployment: drop DetectionRadius, add RadarRange/EORange/IRange/DetectionAccuracy. FireUnit detection fields activated in BuildFireUnits. IDefensePlanner.Plan adds 4th param detectionSources.

Engine: BuildDetectionSources merges standalone detectors + fire-unit self-detection into unified list, passed to planner.

Fix: Solve robustness when GenerateFireEventsAt returns empty (detection boundary too late to intercept).

Tests 193 to 208 (+15). 0 warnings.
2026-06-15 12:52:57 +08:00
3028a421b5 test: unify ground 3-drone route to 5000m (matches single-drone)
Ground 3-drone test route 10000m -> 5000m to match single piston test. Sim time now 46.8s (was 91.6s), identical to single-drone, enabling direct comparison.

Air-based 3-drone stays 10000m (matches air-based single). 193 tests pass.
2026-06-14 22:19:19 +08:00
d70d1f0bf8 fix: multi-lane cloud offset used global index instead of per-lane index
Bug: offset = (eventIdx - (totalRoundsNeeded-1)/2) * spacing used global eventIdx across all lanes. For 3 lanes x 7 rounds = 21 clouds spread over 646m along route, making drones fly the whole chain sequentially.

Fix: offset = (roundInLane - (singleNeeded-1)/2) * spacing. Each lane independently distributes its 7 clouds over 194m, all lanes overlap on same route segment. Drones hit simultaneously.

Result: 3 drones destroyed at same time (t=91.6s, same X=5089), was sequential 87/91/96s. 193 tests pass.
2026-06-14 22:12:32 +08:00
19780b54b9 test: add 3-drone air-based formation integration test
Scenario_3DronesAirBased: 3 piston drones in Formation (Z=0/50/100), 3 air-standard platforms, all destroyed. Verifies air-based multi-lane intercept end-to-end.

193 tests pass.
2026-06-14 22:02:00 +08:00