diff --git a/src/CounterDrone.Core/Simulation/SimulationEngine.cs b/src/CounterDrone.Core/Simulation/SimulationEngine.cs index b4ed304..4059bb4 100644 --- a/src/CounterDrone.Core/Simulation/SimulationEngine.cs +++ b/src/CounterDrone.Core/Simulation/SimulationEngine.cs @@ -29,6 +29,8 @@ namespace CounterDrone.Core.Simulation public SimulationState State { get; private set; } = SimulationState.Idle; public int FrameIndex { get; private set; } public float SimulationTime { get; private set; } + /// 时间倍速:>1 加速仿真(仅测试或快速推演用) + public float TimeScale { get; set; } = 1f; private float _tickInterval; private List _drones = new(); @@ -134,7 +136,8 @@ namespace CounterDrone.Core.Simulation if (State != SimulationState.Running) return new SimulationFrameResult { State = State, FrameIndex = FrameIndex, SimulationTime = SimulationTime }; - SimulationTime += deltaTime; + var scaledDt = deltaTime * TimeScale; + SimulationTime += scaledDt; FrameIndex++; var frameEvents = new List(); @@ -167,7 +170,7 @@ namespace CounterDrone.Core.Simulation // 2. 弹药飞行 → 云团生成 foreach (var m in _munitions.ToList()) { - m.Update(deltaTime); + m.Update(scaledDt); if (m.HasArrived) { var disp = AlgorithmFactory.Create(); @@ -186,7 +189,7 @@ namespace CounterDrone.Core.Simulation // 3. 云团演化 foreach (var c in _clouds.ToList()) { - c.Tick(deltaTime, (float)_scene.WindSpeed, (WindDirection)_scene.WindDirection); + c.Tick(scaledDt, (float)_scene.WindSpeed, (WindDirection)_scene.WindDirection); if (c.IsDissipated) _clouds.Remove(c); } @@ -197,10 +200,10 @@ namespace CounterDrone.Core.Simulation { if (cloud.ContainsPoint(drone.PosX, drone.PosY, drone.PosZ)) { - drone.ExposureTime += deltaTime; + drone.ExposureTime += scaledDt; var dmg = _damageModel.CalculateDamage( drone.TargetType, drone.PowerType, cloud.AerosolType, - cloud.Dispersion.CoreDensity, drone.ExposureTime, deltaTime); + cloud.Dispersion.CoreDensity, drone.ExposureTime, scaledDt); drone.ApplyDamage(dmg); if (drone.Status == DroneStatus.Destroyed) frameEvents.Add(new SimEvent @@ -215,7 +218,7 @@ namespace CounterDrone.Core.Simulation // 5. 无人机移动 foreach (var drone in _drones.Where(d => d.Status == DroneStatus.Flying)) { - drone.Update(deltaTime, (float)_scene.WindSpeed, (WindDirection)_scene.WindDirection); + drone.Update(scaledDt, (float)_scene.WindSpeed, (WindDirection)_scene.WindDirection); if (drone.Status == DroneStatus.ReachedTarget) frameEvents.Add(new SimEvent { @@ -225,7 +228,7 @@ namespace CounterDrone.Core.Simulation } // 6. 平台冷却 - foreach (var p in _platforms) p.Update(deltaTime); + foreach (var p in _platforms) p.Update(scaledDt); // 7. 管控区域 foreach (var drone in _drones.Where(d => d.Status == DroneStatus.Flying)) diff --git a/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs b/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs index 998ffe9..c9f1f05 100644 --- a/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs +++ b/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs @@ -82,6 +82,7 @@ namespace CounterDrone.Core.Tests } engine.Initialize(_taskId); + engine.TimeScale = 4f; // 4倍速加速 for (int i = 0; i < maxTicks; i++) { var r = engine.Tick(tickDt);