3DGS 重建完成后仍显示旧模型:HarmonyOS 7 输出版本与缓存失效设计
升级后暴露的问题
用户补拍后重新重建,任务页显示成功,模型页却仍然展示上一版。清理整个缓存能够暂时解决,却会让每次打开都重新加载。根因通常是“对象 ID”被同时用作业务标识、任务标识和文件缓存键,新结果没有明确版本。
验证边界:本文依据文末列出的华为开发者官方页面整理,并用可执行的 TypeScript 状态模型检查应用侧分支。当前本机只有 API 24 工具链且没有连接 HarmonyOS 7 真机,因此文中的 API 26 接入片段属于按官方资料整理的接入骨架,不声称已经完成 API 26 编译、真机性能测试或设备兼容认证。正式上线前必须在目标 API 26 SDK 与真实设备上补齐编译、权限、异常码和性能证据。
旧设计为什么扛不住
一次重建应生成不可变任务版本,包含输入集合指纹、能力版本、创建时间和结果状态。渲染页只读取业务对象的 activeVersion;新任务完成后先验证文件完整性,再原子切换 activeVersion。旧版本可以延迟回收,但不能继续占用当前缓存键。
新模型的最小实现
type ModelVersion={id:string;inputHash:string;schema:number;ready:boolean}; function activate(current:string|undefined,next:ModelVersion){if(!next.ready)throw new Error('结果未完成');return next.id;} const versions=[{id:'v1',inputHash:'a',schema:1,ready:true},{id:'v2',inputHash:'b',schema:2,ready:false}]; try{activate('v1',versions[1]);throw new Error('未完成版本被激活')}catch(e){if(String(e).includes('未完成版本被激活'))throw e;}迁移中的两个重点场景
案例一:补拍三张后再次重建
输入指纹发生变化,创建 version 2。v2 完成并通过基本校验后切换 activeVersion;如果 v2 失败,v1 仍可打开,页面清楚标记“新版本生成失败”。
案例二:应用升级后渲染格式变化
缓存元数据加入 rendererSchema。升级发现旧 schema 不兼容时只失效渲染派生缓存,保留原始可复用输出;不能直接删除用户素材。
不选择另外两条捷径的原因
全量清缓存简单但成本高;只按对象 ID 缓存又会读旧数据。版本化输出允许失败回退、差异回收和问题追踪。版本 ID 与业务对象分开后,日志可以明确记录“哪个输入生成了哪个结果”,也便于后续迁移。
迁移验收表
| 验证项 | 通过标准 |
| 相同输入重复请求:按策略复用或明确新版本 | 有可重复步骤、日志或可见结果 |
| 新增输入:指纹必须变化 | 有可重复步骤、日志或可见结果 |
| 新版本失败:旧 activeVersion 不变 | 有可重复步骤、日志或可见结果 |
| 文件不完整:禁止原子切换 | 有可重复步骤、日志或可见结果 |
| 回收旧版本:当前和回退版本不被删除 | 有可重复步骤、日志或可见结果 |
官方资料与证据边界
版本模型属于应用数据设计,不是 Spatial Recon Kit 自动提供的缓存协议。真实输出文件、格式及可复用范围应依据当前官方接口和真机结果确定。
1. Spatial Recon 术语表
2. 空间计算能力接入
3. 2026 年 9 月开发者月刊
最后留下一个可复用结论
这篇文章不把“接口能调用”当成完成。真正可复用的是:先确定输入契约和生命周期,再把失败路径写进状态模型;平台能力负责提供机制,应用负责把机制变成可观察、可回退、可验证的工程链路。下一次遇到同类问题,先复现和记录证据,再调整实现,不靠重复重试掩盖根因。