perf: 毁伤判定加快速排斥 (距离>2R跳过PathInSphere)

密度检查提前到外层循环,减少不必要计算
This commit is contained in:
tian 2026-06-15 18:47:11 +08:00
parent 9964d77751
commit 2a87b77085
3 changed files with 10 additions and 4 deletions

View File

@ -275,22 +275,28 @@ namespace CounterDrone.Core.Simulation
}
}
// 6. 毁伤判定:积分路径段在云内的时间
// 6. 毁伤判定:积分路径段在云内的时间(快速排斥:先检查包围盒)
var (wvx, wvy, wvz) = Kinematics.WindToVector((WindDirection)_scene.WindDirection, (float)_scene.WindSpeed);
float cloudDx = wvx * scaledDt, cloudDy = wvy * scaledDt, cloudDz = wvz * scaledDt;
float effectiveConcentration = (float)_ammoSpec.EffectiveConcentration;
for (int di = 0; di < _flyingDrones.Count; di++)
{
var drone = _flyingDrones[di];
for (int ci = 0; ci < _clouds.Count; ci++)
{
var cloud = _clouds[ci];
if (cloud.Dispersion.CoreDensity < effectiveConcentration) continue;
// 快速排斥:检查无人机与云团中心的距离是否在 2×有效半径内
float effR = cloud.Dispersion.EffectiveRadius;
float ccx = cloud.Dispersion.Center.X, ccy = cloud.Dispersion.Center.Y, ccz = cloud.Dispersion.Center.Z;
float dx = drone.PosX - ccx, dy = drone.PosY - ccy, dz = drone.PosZ - ccz;
float distSq = dx * dx + dy * dy + dz * dz;
if (distSq > effR * effR * 4) continue; // 距离 > 2R不可能穿云
float inCloudDistance = DamageAssessment.PathInSphere(
drone.PrevX - (ccx - cloudDx), drone.PrevY - (ccy - cloudDy), drone.PrevZ - (ccz - cloudDz),
drone.PosX - ccx, drone.PosY - ccy, drone.PosZ - ccz,
0f, 0f, 0f,
cloud.Dispersion.EffectiveRadius);
if (inCloudDistance > 0 && cloud.Dispersion.CoreDensity >= (float)_ammoSpec.EffectiveConcentration)
0f, 0f, 0f, effR);
if (inCloudDistance > 0)
{
float exposureIncrement = inCloudDistance / (drone.TypicalSpeed / 3.6f);
drone.ExposureTime += exposureIncrement;