# 点云保存与内存保护 ## 自动完整保存 - 扫描开始时同时开启 `enableDebug` 和 `savePointCloud`,基类为每台相机的本次扫描创建一个文件。 - 扫描期间逐帧提交原始点云,后台线程持续写入 TXT;不分段,不等待全部数据进入内存后再保存。 - 此自动采集保存路径固定使用 TXT,不受 `storageType` 的二进制选择影响。手动保存和原有离线保存仍沿用原配置。 - 输出位置沿用 `debugOutputPath`,按应用名和日期建立目录,文件名包含设备和扫描时间。 - 正在写入的文件暂用 `.txt.part` 后缀,内容为 TXT。正常结束时排空待写队列、回填实际扫描线数,再改名为 `.txt`。 - 创建文件失败时不启动该相机的扫描;写入失败、取消或断线时保留 `.part`,不能将它视为完整扫描。异常退出留下的 `.part` 需要人工检查和清理。 - 每台相机的写入队列上限为 8 MiB,包含正在写入的扫描线。队列满时等待写线程,不静默丢帧;超过队列容量的单帧或写入错误会明确标记失败。 - TXT 格式化在后台线程完成,SDK 回调仅复制待写扫描线,不长期保存 SDK 指针。 ## WeldSeam 缓存 - 不论调试保存是否开启,WeldSeam 都尝试保留 `m_detectionDataCache`,供右键手动保存使用。 - 每帧复制缓存前检查系统可用物理内存;Windows 使用 `GlobalMemoryStatusEx`,Linux 使用 `/proc/meminfo` 的 `MemAvailable`。 - 预留 1 GiB,并额外考虑下一帧、容器扩容以及 32 MiB 运行余量。继续缓存可能越过保留线时,本次扫描永久停止追加缓存,不因内存稍后恢复而重新追加。 - 内存查询失败也保守停止缓存。内存分配失败同样标记缓存不完整,并安全释放本帧尚未交给缓存的数据。 - 已缓存的前缀数据保留;后续逐帧增量算法处理和自动完整 TXT 写入不受缓存停止影响。 - 扫描/检测完成后仍保留缓存。下一次扫描或加载新数据时,清空旧缓存并重置不完整标记。 - 右键保存时,缓存不完整会提示“内存不足,导致数据不完整”,确认后才能保存部分数据;若一帧都未缓存,直接提示该原因。 - 扫描和检测期间不允许手动导出缓存,避免阻塞采集及将扫描中的前缀误认为完整数据。 - 其他项目的算法缓存策略不变,仅自动点云保存切换为采集期间写入。 ## 边界与现场确认 - 1 GiB 是本程序停止增加缓存的保护线,不能保证其他进程或算法的额外分配不会让系统可用内存继续下降。 - 有限队列满时产生背压,是否影响设备帧率取决于 SDK 和硬盘吞吐;需使用实际设备、实际单帧点数确认 500 fps、连续三分钟的吞吐,不能仅凭写入逻辑承诺硬件端不丢帧。 - 正常扫描检查最终 TXT 可复检、扫描线数与接收帧数一致、帧号覆盖整次扫描。 - 低内存扫描检查缓存停止后不再增长,检测正常完成,手动保存明确提示不完整,自动 TXT 仍覆盖后续帧。 - 连续两轮扫描检查文件不覆盖、不串帧,不完整标记在新一轮清零。 - 检查普通项目单相机/多相机扫描、主动停止、取消、断线、无写权限和磁盘写满路径;失败时不能生成看似成功的完整 TXT。