3.3 KiB
3.3 KiB
点云保存与内存保护
自动完整保存
- 扫描开始时同时开启
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。