4.9 KiB
IFC 导入性能优化
目标:缩短同一个 AC14-FZK-Haus.ifc 建筑样本的 349.013 秒浏览器导入时间。 保留原始 BRep、有效性检查、失败回滚、空间层级、单位与显示精度。
瓶颈和改动
原浏览器日志的相邻事件间隔估算:转换/分发约 60.6 秒、产品处理约 68.2 秒、 修复和复验约 146.8 秒、场景生成约 60.1 秒。这是日志区间估算,不是 CPU 采样分析;与完整用例计时之间还存在文件及浏览器开销。
根因是 ShapeFix_Shape 对包含少量无效面的整个家具产品执行完整修复,重复
处理大量已经有效的几何。最终实现复用 BRepCheck_Analyzer 的子形状结果,
仅对无效面调用原有 OCCT 修复器,共享 ShapeBuild_ReShape 替换上下文。对
完整产品再做相同的 BRep 有效性检查;涉及壳/实体关系的缺陷若未修复,回退到
一次原有全形状修复。未改变容差、未关闭几何检查、未过滤家具或其他产品。
首个“递归子复合体且每层回退”实验反而耗时更长,已停止并撤掉,失败记录
保留于 ifc-native-2026-09-15T20-39-29-841Z。最终代码没有保留该实验策略。
原生复测
| 项目 | 原值 | 优化后 |
|---|---|---|
| 原生导入 | 311.793 秒(历史原生记录) | 169.389 秒 |
| #92842 修复和复验 | 约 48.22 秒(浏览器日志) | 3.647 秒(原生计时) |
| #180995 修复和复验 | 约 84.72 秒(浏览器日志) | 4.750 秒(原生计时) |
| #199496 修复和复验 | 约 13.89 秒(浏览器日志) | 6.959 秒(原生计时) |
不同环境和计时来源在表中明确区分,不能将原生 169 秒直接替代浏览器 349 秒。 另一轮原生导入测得 167.426 秒,但该轮旧统计口径检查失败,因此不记作验收 通过。它把空间分组自动聚合的 Shape 计入数量,受此前隐藏开洞/空间体的规则 影响。后续使用优化前保存的 FCStd 读取实际 Part 实体建立基线,逐实体核对, 没有把不一致的统计简单忽略。
原始 FCStd SHA-256:3ecba28f150859a16685a8c2497076dd1802077c5c285233f0f5235605a6a552。
- 原生对象 147、Part 实体 134、空间分组 12,与基线一致。
- 所有实体名称、GlobalId、面数均一致。
- 最大体积差
3.5762786865234375e-7 mm^3。 - 最大表面积差
2.7939677238464355e-9 mm^2。 - 最大包围盒坐标差
5.4569682106375694e-12 mm。 - 逐实体体积/表面积相对容差
1e-7(绝对下限1e-5),包围盒绝对容差1e-5 mm。所有比较通过,FCStd 保存通过。 - IFC4 属性集、损坏文件和已有文档保护回归通过。
- 严格类型、正式构建和几何边界检查通过。
浏览器复测
最终冷导入:349.013 秒 -> 218.696 秒,减少 130.317 秒(37.34%),约 1.60 倍吞吐。 这是同一模型单次前后实测,不是多设备统计性能承诺。
使用同一 IFC 文件、新建 Chrome 用户目录、新测试源和空 OPFS,不从已经导入的文档命中缓存。 初始视口、Three.js 显示精度与原浏览器基线一致。
- 浏览器版本一致:Chrome/151.0.7922.137,视口 1440 x 1000。
- IFC 文件 SHA-256 一致:c8600fd63d1734d18f40fb1237533e9a3ec46c157489be7d501c166b99f21846。
- 对象 147、可见网格 110、三角形 36,716,均与原基线一致。
- 本轮浏览器原生计时:几何校验累计 55.73 秒,局部修复和复验累计 13.41 秒。
- 整组七种格式用例 246.488 秒,全部通过;IFC 的 218.696 秒是单项操作耗时, 不将其他格式测试和最后证据写入计入 IFC 操作。
- 仍有转换、完整有效性校验、场景网格化成本;本次没有通过删对象、增大网格 偏差、放宽错误检查或使用缓存掩盖它们。后续优化须继续保持逐实体基线比较。
复现
timeout 180s node tools/read_ifc_geometry_baseline.mjs
timeout 600s node tools/test_ifc_native_import.mjs
timeout 120s node tools/test_ifc_native_contract.mjs
node tools/run_user_repair_checks.mjs
FREECAD_MANUAL_IDS=FILE-02 node tools/run_user_manual_tests.mjs
node tools/report_ifc_performance.mjs
本次未重编全部 IFC/OCCT 依赖,也未改变整体技术路线。优化针对当前真实建筑 样本,不保证每个 IFC 文件相同比例加速。全形状修复回退仍可能耗时,完整 BIM 作者/IFC 导出能力仍不在本次范围内。