将ClashDetective检测模式从HardConservative改为Hard,提高检测性能
This commit is contained in:
parent
23801726ab
commit
e5b8501a63
@ -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. **结果缓存**:
|
||||
- 缓存相同对象对的碰撞检测结果
|
||||
- 对重复检测任务直接返回缓存结果
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user