diff --git a/doc/working/碰撞检测性能优化_20251208.md b/doc/working/碰撞检测性能优化_20251208.md index 343c8d4..63acb4d 100644 --- a/doc/working/碰撞检测性能优化_20251208.md +++ b/doc/working/碰撞检测性能优化_20251208.md @@ -265,4 +265,104 @@ while (stack.Count > 0) - `PathAnimationManager.cs`: - 添加空间索引初始化检查 - 只在首次构建空间索引,后续复用缓存 - \ No newline at end of file + +## 碰撞检测算法性能优化 (2025-12-10) + +### 问题分析 + +智能去重策略实现后,通过详细的子步骤调试日志发现,单个碰撞测试的执行时间仍然较长: + +```log +[2025-12-10 14:02:16.650] [DEBUG] [分组测试] 智能去重-测试添加: 临时测试添加完成, 耗时: 27ms +[2025-12-10 14:02:16.651] [DEBUG] [分组测试] 智能去重-设置几何类型: 耗时: 0ms +[2025-12-10 14:02:16.887] [DEBUG] [分组测试] 智能去重-测试执行: 临时测试运行完成, 耗时: 235ms +[2025-12-10 14:02:16.888] [DEBUG] [分组测试] 智能去重-获取测试结果: 耗时: 0ms +``` + +其中 `TestsRunTest()` 方法调用平均耗时约 200-250ms/次,占总检测时间的 90% 以上,成为新的性能瓶颈。 + +### 根本原因 + +1. **测试类型选择**:使用了 `ClashTestType.HardConservative`(保守硬碰撞)模式 + - 比普通 `Hard` 模式更复杂,会额外检测体积重叠但几何体不相交的情况 + - 需要处理四种特殊情况:面接触边缘、共面面重叠、边接触端点、共轴边重叠 + - 增加了大量额外的计算逻辑 + +2. **几何类型设置**:包含了 `PrimitiveTypes.Triangles | PrimitiveTypes.Lines | PrimitiveTypes.Points` + - 检测所有类型的几何体,增加了检测的全面性但降低了性能 + - 点和线的碰撞检测在实际应用中很少产生有意义的结果 + +### 优化方案 + +1. **降低测试类型复杂度**:将 `HardConservative` 改为普通 `Hard` 模式 + - 普通 `Hard` 模式只检测实际相交的几何体 + - 可以显著提高性能,同时保持足够的检测精度 + +2. **减少几何类型**:仅保留 `PrimitiveTypes.Triangles` + - 大多数实际碰撞都通过三角形检测就能发现 + - 去掉点和线的检测可以减少计算量 + +### 优化结果 + +优化后,单个碰撞测试的执行时间显著降低: + +```log +[2025-12-10 14:15:39.277] [DEBUG] [分组测试] 智能去重-测试添加: 临时测试添加完成, 耗时: 18ms +[2025-12-10 14:15:39.278] [DEBUG] [分组测试] 智能去重-设置几何类型: 耗时: 0ms +[2025-12-10 14:15:39.412] [DEBUG] [分组测试] 智能去重-测试执行: 临时测试运行完成, 耗时: 133ms +[2025-12-10 14:15:39.412] [DEBUG] [分组测试] 智能去重-获取测试结果: 耗时: 0ms +``` + +**性能提升对比**: + +- 测试执行时间:235ms → 133ms(约 43% 提升) +- 智能去重总耗时:~20,000ms → 16,709ms(约 16.5% 提升) +- 检测效率:确认碰撞 16 组,跳过 296 个冗余检测点(与优化前相同) + +### 优化的关键代码变更 + +在 `ClashDetectiveIntegration.cs` 中进行了以下修改: + +1. **修改测试类型**: + + ```csharp + // 之前 + TestType = ClashTestType.HardConservative, + + // 之后 + TestType = ClashTestType.Hard, + ``` + +2. **减少几何类型**: + + ```csharp + // 之前 + copyTest.SelectionA.PrimitiveTypes = PrimitiveTypes.Triangles | PrimitiveTypes.Lines | PrimitiveTypes.Points; + copyTest.SelectionB.PrimitiveTypes = PrimitiveTypes.Triangles | PrimitiveTypes.Lines | PrimitiveTypes.Points; + + // 之后 + copyTest.SelectionA.PrimitiveTypes = PrimitiveTypes.Triangles; + copyTest.SelectionB.PrimitiveTypes = PrimitiveTypes.Triangles; + ``` + +### 后续优化建议 + +1. **配置化优化参数**: + - 添加容差值(Tolerance)配置,可根据项目需求调整检测精度 + - 提供碰撞测试类型选择选项,让用户在精度和性能间平衡 + +2. **批量检测优化**: + - 实现批量碰撞检测API调用,减少Navisworks API调用开销 + - 合并相似检测任务,提高处理效率 + +3. **并行处理**: + - 对独立的碰撞检测任务实现并行处理 + - 利用多核CPU资源加速检测过程 + +4. **碰撞预判**: + - 添加简单的边界框碰撞预判 + - 对明显不碰撞的对象对提前过滤,避免不必要的精确检测 + +5. **结果缓存**: + - 缓存相同对象对的碰撞检测结果 + - 对重复检测任务直接返回缓存结果 diff --git a/src/Core/Collision/ClashDetectiveIntegration.cs b/src/Core/Collision/ClashDetectiveIntegration.cs index 443c1dd..2e6116d 100644 --- a/src/Core/Collision/ClashDetectiveIntegration.cs +++ b/src/Core/Collision/ClashDetectiveIntegration.cs @@ -333,7 +333,8 @@ namespace NavisworksTransport var mainTest = new ClashTest { DisplayName = mainTestName, - TestType = ClashTestType.HardConservative, + // HardConservative 模式的缺点是性能低。如果要提高性能,可以用Hard模式 + TestType = ClashTestType.Hard, Tolerance = detectionGap, Guid = Guid.Empty, MergeComposites = true