HarmonyOS 7 onContinue:3DGS跨设备接续与LOD降级
一、接续成功了画面却回到场景入口SplatContinuityLab 的需求听起来很自然用户在手机上查看一个 3DGS 车站模型走到工位后把视角接续到大屏继续看刚才的柱体和站台。第一版也确实能拉起目标设备但画面总是回到默认相机偶尔连续点两次接续目标端还会创建两套场景显存占用翻倍。故障发生时系统能力本身没有报错。问题在我们传输的状态最初尝试把可见 Gaussian 缓冲和纹理一起序列化快照又大又慢目标端还无法复用源端 GPU 资源。后来只传相机矩阵却缺少块水位和场景版本目标端先显示默认首帧再突然跳到正确位置。任务 CONT-1812 就从这两次失败里定下来只传可验证的轻量快照恢复只能提交一次并按目标设备能力决定 LOD。最终 Demo 页面叫 HandoffViewportPage场景是station_loop_v3.splat。快照只有 1.6 KiB包含 pose epoch 42、相机位姿、可见块 88/89/90、源端 LOD 2 和一次性 resume token。目标设备内存档位为 LOW因此恢复时把 LOD 从 2 降到 1148 ms 内进入 CONTINUED重复启动被忽略 1 次。二、16:04先删掉所有不能跨设备复用的东西第一次复盘时我们把快照字段分成三类。业务身份可以传场景 ID、版本、相机位姿和选中物恢复提示可以传可见块 ID、源端 LOD、曝光参数进程资源绝不能传文件描述符、mmap 地址、GPU buffer handle、ArkGraphics 3D 实体引用。后者在目标进程没有意义序列化它只会制造错误安全感。第一段代码生成纯数据快照并给每次接续分配 token。浮点数保留六位既控制体积也避免矩阵在 JSON 往返后出现无意义尾差。可见块最多记录三个目标端把它们当预热提示而不是“必须存在”的真相。// ContinuitySnapshot.etsexportinterfaceHandoffSnapshot{version:3;scene:string;poseEpoch:number;token:stringcamera:number[];visibleBlocks:number[];sourceLod:number}exportfunctionencodeHandoffSnapshot(state:ViewportState):string{constsnapshot:HandoffSnapshot{version:3,scene:station_loop_v3.splat,poseEpoch:42,token:CONT-1812-${Date.now()},camera:state.camera.map((v)Number(v.toFixed(6))),visibleBlocks:state.visibleBlocks.slice(0,3),sourceLod:2}returnJSON.stringify(snapshot)}编码发生在用户确认接续之后、场景还处于前台时。页面离场后不会重新读取相机避免动画结束回调把另一组位姿混进快照。若场景版本正在更新接续按钮暂时不可用我们宁可提示“资源校验中”也不发送一个目标端无法验证的版本。三、16:18onContinue 只负责交付证据源端 UIAbility 的onContinue不执行网络传输也不等待目标设备加载模型。它只检查当前页面是否可接续生成快照并写入wantParam。序列化失败、场景尚未就绪或快照超过预算时返回拒绝页面仍保持原状态。// EntryAbility.etsonContinue(wantParam:Recordstring,Object):AbilityConstant.OnContinueResult{conststateContinuityStore.current()if(!state||state.phase!VIEWING){returnAbilityConstant.OnContinueResult.REJECT}constpayloadencodeHandoffSnapshot(state)if(newTextEncoder().encode(payload).byteLength8*1024){returnAbilityConstant.OnContinueResult.REJECT}wantParam[continuityTask]CONT-1812wantParam[handoffSnapshot]payload hilog.info(0x1812,SplatContinue,taskCONT-1812 snapshot1.6KiB epoch42 blocks88,89,90)returnAbilityConstant.OnContinueResult.AGREE}这里的 8 KiB 是项目预算不是系统通用上限。它逼着快照保持“恢复描述”而不是资源包。方法返回后源端页面不会立刻销毁渲染资源只有接到接续完成状态才进入 SUSPENDED并按正常生命周期释放场景。若接续失败用户仍可以在源端继续操作。四、16:31目标端必须先去重再创建场景重复恢复来自两个入口冷启动走onCreate目标 Ability 已存在时又可能收到新的 Want。如果两条路径都直接创建 ArkGraphics 3D 场景就会得到两份 renderer 和两套块缓存。修复后的restoreFromWant先验证版本和 token再查询已消费集合同一 token 第二次到达只记录 ignored不触碰资源。// ContinuityRestorer.etsexportasyncfunctionrestoreFromWant(want:Want,tier:LOW|MID|HIGH):PromiseRestoreResult{constrawwant.parameters?.[handoffSnapshot]asstringconstsnapshotJSON.parse(raw)asHandoffSnapshotif(snapshot.version!3||ResumeTokenStore.has(snapshot.token)){return{state:IGNORED_DUPLICATE,duplicateIgnored:1}}ResumeTokenStore.reserve(snapshot.token)consttargetLodtierLOW?Math.min(snapshot.sourceLod,1):snapshot.sourceLodconstsceneawaitsceneLoader.open(snapshot.scene,targetLod)awaitscene.prewarm(snapshot.visibleBlocks)scene.camera.apply(snapshot.camera,snapshot.poseEpoch)ResumeTokenStore.commit(snapshot.token)return{state:CONTINUED,duplicateIgnored:0,targetLod}}token 先 reserve、成功后 commit是为了区分“正在恢复”和“已经恢复”。恢复失败会释放 reserve允许系统再次投递已 commit 的 token 则保留到场景关闭。场景加载、块预热和相机提交都在同一个 generation 下执行页面退出或新的接续到来会令旧 generation 失效迟到回调只能释放自身资源不能改写 UI。DevEco Studio 的 HiLog 按同一任务记录snapshot1.6KiB epoch42 blocks88,89,90目标端输出tierLOW lod2-1 restore148ms stateCONTINUED duplicateIgnored1。右侧模拟器显示的场景名、块号、LOD 与日志一致方便判断接续看到的是不是同一份证据。五、16:47LOD 降级不是失败而是能力协商结果目标设备无法保证和源端拥有同等内存与 GPU 预算。最初代码强行按 sourceLod2 恢复在低档设备上虽然视角正确却会因为块预热过多造成首帧停顿。现在目标端先读取能力档位LOW 使用 LOD 1只预热 88/89/90 的低精度块MID/HIGH 可以保持 LOD 2。相机、选中物和曝光不降级变化只发生在几何与 SH 精度。这条规则也写进 UI避免用户把清晰度变化误判为接续失败。结果页同时展示“源端 LOD 2 / 目标 LOD 1 / 原因 LOW 内存档位”。后台还会在稳定三秒后尝试升档但升档属于新的渲染任务不修改 CONT-1812 的恢复结果。从点击接续到首帧稳定共 148 ms解析与验证 6 ms模型索引打开 39 ms三块预热 71 ms场景创建与相机提交 32 ms。这里没有把源端 GPU 数据传过来速度来自目标端已有模型和精确预热提示而不是绕过资源生命周期。六、源端和目标端各自有一条释放顺序接续完成后源端不是立即destroy。它先停止相机手势采样冻结 pose epoch等待正在提交的帧结束再释放 ArkGraphics 3D 实体和块租约。目标端如果进入后台只暂停渲染并保留已提交 token回到前台可以恢复同一场景不会把系统重投的 Want 当成第二次接续。取消也有明确边界。用户在目标端首帧前返回当前 generation 失效预热块逐一归还场景对象释放token 的 reserve 被清除源端保持 VIEWING。只有目标端提交第一帧并写入 commit 后源端才切到 SUSPENDED。这样不会出现两边都认为自己已交接、结果两边都释放的空窗。七、最终状态比“拉起成功”更重要CONT-1812 最终的验收条件并不复杂快照 1.6 KiB场景与版本一致pose epoch 42预热块 88/89/90目标档位 LOWLOD 2→1148 ms 首帧重复恢复忽略 1 次状态 CONTINUED。任何一项不一致页面都会保持 VERIFYING而不是先展示默认场景再补救。这次复盘让我重新确认了跨设备接续的核心它不是把源进程搬到目标进程而是交付一份足够小、足够明确、可以验证的恢复意图。资源在各自设备重新创建生命周期各自闭环token 把重复入口收敛成一次提交。做到这些以后用户感知到的才是“继续看刚才的位置”而不是一次带着偶然性的远端启动。

相关新闻

Vscode 使用编码神器 CLINE 对接 QwQ-32B:把 Base URL 改到 TaoToken

Vscode 使用编码神器 CLINE 对接 QwQ-32B:把 Base URL 改到 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 7:48:06 阅读更多 →
可控、可测、可进化:用 AI Agent 构建跨境支付风控系统实战

可控、可测、可进化:用 AI Agent 构建跨境支付风控系统实战

👋 Hi,我擅长 AI 大模型应用落地、意识解码与 AI 开发工具链 。 💡 创业路上,用技术换时间,一起把 AI 变成生产力 🚀 >可控、可测、可进化:用 AI Agent 构建跨境支付风控系统实战 在 B2B 跨境…

2026/10/11 12:46:42 阅读更多 →
2026年5款录音转文字工具实测:适配性、准确率、稳定性比对与TaoToken接入配置

2026年5款录音转文字工具实测:适配性、准确率、稳定性比对与TaoToken接入配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 12:33:35 阅读更多 →

最新新闻

Windows下MySQL安装配置与卸载全攻略:从版本选择到残留清理

Windows下MySQL安装配置与卸载全攻略:从版本选择到残留清理

如果你也在Windows上折腾过MySQL,应该能理解那种感受:下载页面一堆版本不知道选哪个,安装到一半卡住,装完了服务起不来,或者换版本时残留文件清不干净,重装总报错。这些坑我基本都踩过一遍,花了…

2026/10/13 11:04:15 阅读更多 →
Thingsboard接入Modbus协议的工程实践与稳定架构设计

Thingsboard接入Modbus协议的工程实践与稳定架构设计

1. 项目概述:为什么一个工业协议接入模块值得单独深挖?“Thingsboard modbus协议”——这六个字背后,不是一句轻飘飘的配置说明,而是一条横跨工业现场与云端管理的真实数据链路。我第一次在某智能配电柜远程监控项目里碰上这个组合…

2026/10/13 11:04:15 阅读更多 →
MySQL与Redis缓存一致性实战:从原理到架构选型

MySQL与Redis缓存一致性实战:从原理到架构选型

做后端这几年,我算是把“缓存和数据库数据对不上”这件事踩透了。团队经常半夜被叫醒,一查原因,十有八九是 Redis 里的旧数据还在服务,而 MySQL 里的记录早就改了。这问题听着朴素,真要讲清楚,背后牵扯到读…

2026/10/13 11:04:15 阅读更多 →
电商数据分析实战:从CLV到营收预测的完整链路

电商数据分析实战:从CLV到营收预测的完整链路

这种预测需求,在如今做电商数据分析的人手里,几乎每周都会撞上一次:老板在周会上盯着营收曲线,问"下个月能不能回到峰值""这批流失客户还值不值得砸券召回";运营拿着用户分群报表,却不…

2026/10/13 11:04:15 阅读更多 →
SpringBoot直连Hive:JDBC接入全流程与常见坑详解

SpringBoot直连Hive:JDBC接入全流程与常见坑详解

最近在给一个数据平台做数据接口,需要让SpringBoot服务通过JDBC直连Hive,把数仓里的离线结果表实时捞过来给前端展示。这个说起来好像就是连个数据库,但实际操作中,Hive和MySQL这些传统关系型数据库在驱动、依赖、协议、会话管理上…

2026/10/13 11:04:15 阅读更多 →
Java全栈演唱会售票系统开发与高并发优化实践

Java全栈演唱会售票系统开发与高并发优化实践

1. 项目概述与核心价值演唱会售票系统是连接演出主办方与观众的关键数字化桥梁。这个基于Java技术栈的全栈解决方案,通过SpringBoot/SSM后端Vue前端uniapp多端的组合架构,实现了从票务管理、在线选座到移动端购票的完整闭环。我在实际票务系统开发中发现…

2026/10/13 11:03:11 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →