将ClashDetective检测模式从HardConservative改为Hard,提高检测性能

This commit is contained in:
tian 2025-12-10 14:36:06 +08:00
parent 23801726ab
commit e5b8501a63
2 changed files with 103 additions and 2 deletions

View File

@ -265,4 +265,104 @@ while (stack.Count > 0)
- `PathAnimationManager.cs`:
- 添加空间索引初始化检查
- 只在首次构建空间索引,后续复用缓存
## 碰撞检测算法性能优化 (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. **结果缓存**
- 缓存相同对象对的碰撞检测结果
- 对重复检测任务直接返回缓存结果

View File

@ -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