工程模型缓存失效,为什么不能只看文件时间戳

4 阅读3分钟

大型 BIM、CAD 和工业装配进入浏览器前,通常会先转换成面向查看的缓存。真正难的不是“把缓存写出来”,而是判断它什么时候仍然可信。

如果缓存键只有源文件路径和修改时间,迟早会出现三类问题:文件内容变了但时间戳被保留;转换器升级后仍命中旧结构;外部引用、材质或装配依赖变化,却继续复用主文件缓存。

一个可审计的缓存身份

缓存身份至少应由五部分组成:

  1. 源内容摘要:对实际输入字节计算稳定摘要,不把文件名当身份。
  2. 转换器版本:解析器、三角化器、材质处理和坐标规则变化,都可能改变结果。
  3. 转换配置:单位、上轴、精度、LOD、属性保留范围和装配展开策略必须进入键。
  4. 依赖集合:外部引用、贴图、字体、零件文件和字典数据需要单独摘要并形成依赖图。
  5. 缓存 Schema 版本:字段布局、对象身份和索引结构改变时,应直接生成新缓存,不在运行时猜测旧字段。

可以把最终键理解为:

cacheKey = hash(sourceDigest, converterVersion, normalizedOptions, dependencyManifest, schemaVersion)

关键不是公式本身,而是每一项都能记录、比较和复现。

发布缓存也要原子化

转换过程不要直接覆盖当前可用缓存。更稳妥的流程是:写入临时版本,完成结构数量、包围盒、对象映射和资源清单校验,再原子切换 manifest。中途取消、进程崩溃或磁盘写满时,旧版本仍可读取,半成品不会被误认为有效结果。

模型会话还应携带 generation。用户快速切换模型时,旧网络请求、Worker 解码和 GPU 上传即使晚到,也必须在提交前校验代际;过期结果只释放,不回写新场景。

业务身份不要跟着缓存键漂移

内容摘要适合判断缓存是否相同,却不等于业务资产主键。源对象 ID、缓存对象 ID、渲染索引和企业资产 ID 应分层映射。新版本缓存发布时生成迁移表,明确哪些对象继承、拆分、合并或删除,避免批注、告警和工单落到错误构件。

验收缓存的四组测试

  • 内容不变但路径改变,应该复用还是重建?
  • 主文件不变但外部引用改变,是否正确失效?
  • 转换器或 Schema 升级,是否隔离旧缓存?
  • 转换中途取消或崩溃,是否仍能读取上一个完整版本?

我们在 ModelView 里把首次源格式转换和再次打开明确分开:模型完成首次转换并生成缓存后,亿级三角面模型可以在 5 秒内再次打开并进入可交互视图,浏览和审阅保持满帧。这个结果成立的前提,就是缓存身份、发布和资源生命周期都有明确边界。

说明一下,我是 ModelView 的开发者。项目和 Windows 标准版:

gitee.com/onedraw/mod…

参考: