【共创稿事节】HarmonyOS 7一台采集一台渲染的协同链路设计
3DGS 重建吃算力采集吃便携性这两件事很难在同一台设备上做到最好。手机拿着拍方便但重建耗时 12-15 秒用户等得发慌平板算力大重建快但举着平板环绕拍摄手感很差。我们想做的链路是手机采集、平板重建、手机渲染——三台设备各干各的擅长的事。这条链路看着简单真跑通要解决数据传输和坐标系对齐两个硬问题。能力面跨设备数据传输的两条路HarmonyOS 跨设备传输有两条路可走分布式数据同步和文件直传。两条路我们都试了结论是重建结果用文件直传采集素材用分布式数据同步。分布式数据同步distributedDataObject适合小数据量、需要实时同步的场景。我们一开始用它传重建结果PLY 文件约 30-50MB结果超时频繁。分布式数据同步的设计目标是 KV 数据和轻量对象传大文件不是它的强项。文件直传走的是分布式文件系统distributedFile或 Socket 直连。大文件传输稳定性好得多但没有分布式数据同步那种自动同步的便利要自己管理传输状态。// ArkTS跨设备文件直传import{distributedDeviceManager}fromkit.DistributedKit;import{fileIo}fromkit.CoreFileKit;// 1. 发现对端设备constdeviceManagerdistributedDeviceManager.createDeviceManager({bundleName:com.example.recon});constdevicesdeviceManager.getAvailableDeviceListSync();// 2. 通过分布式文件系统发送重建结果asyncfunctionsendReconResult(filePath:string,targetDeviceId:string):Promisevoid{// distributedFile 走设备间直连适合大文件constdistributedFileawaitfileIo.createDistributedFile({localPath:filePath,targetDeviceId:targetDeviceId,targetPath:/data/storage/el2/base/files/recon/result.ply});awaitdistributedFile.transfer({onProgress:(sent:number,total:number){// 传输进度回调用于 UI 反馈constpercentMath.floor(sent/total*100);updateTransferProgress(percent);},timeout:30000// 30 秒超时50MB 文件够用});}采集素材视频或图像序列从手机传到平板我们走分布式数据同步。原因是采集素材需要在两台设备间实时可见——手机拍的时候平板要能看到拍摄状态引导拍摄。这种实时同步用分布式数据同步方便数据量也不大预览帧缩放到 480p 传原始素材拍完再文件直传。约束面传输耗时与坐标系对齐跨设备链路的两个硬约束传输耗时和坐标系对齐。传输耗时数据大小传输方式耗时备注采集预览帧~0.2MB/帧分布式数据同步50-80ms/帧缩放到 480p采集素材视频80-120MB文件直传8-15s取决于网络重建结果PLY30-50MB文件直传3-6s不含 SH重建结果PLY 含 SH45-75MB文件直传5-9s含 SH渲染控制指令1KB分布式数据同步20-50ms视角、缩放等数据在手机和平板间跑的两台设备距离 0.5 米以内Wi-Fi Direct 连接。传输耗时波动比较大采集素材传输 8-15 秒的范围是因为视频编码不同——H.264 编码的 80MB 传 8 秒未编码的图像序列 120MB 传 15 秒。端到端延迟的瓶颈是采集素材传输不是重建。手机拍完到平板开始重建中间有 8-15 秒的传输空等。这段时间用户盯着进度条体验很差。我们试过边拍边传流式传输但 3DGS 重建需要完整素材没法增量重建流式传了也要等传完才能开始重建。坐标系对齐这是更隐蔽的坑。手机采集时的坐标系是手机相机坐标系平板重建结果的坐标系基于平板对素材的解析。如果两台设备对素材的元数据EXIF 方向、视频旋转标记解析不一致重建结果的坐标系就会差一个旋转。我们遇到的情况手机拍的视频带 90 度旋转标记竖屏拍摄平板重建时没读旋转标记重建结果的上方向变成了侧方向。渲染出来模型侧躺着。更麻烦的是渲染端的坐标系。手机渲染时手机的 IMU 和相机位姿决定渲染视角。如果渲染用的坐标系跟重建结果的坐标系不一致渲染视角对不上用户转头时场景转错方向。// ArkTS坐标系对齐——传重建结果时附带坐标系元数据interfaceReconResultWithMeta{plyData:string;// PLY 文件路径coordinateSystem:{upAxis:Y|Z;// 上轴方向handedness:left|right;// 左右手系rotationOffset:{// 相对采集设备的旋转偏移x:number;y:number;z:number;w:number;};};captureDeviceOrientation:number;// 采集时设备方向0/90/180/270}// 渲染端根据元数据校正坐标系functionapplyCoordinateCorrection(gsNode:spatialRender.GSNode,meta:ReconResultWithMeta[coordinateSystem]):void{// 重建结果坐标系跟渲染端不一致时旋转 GSNode 校正gsNode.rotationmeta.rotationOffset;// 如果上轴是 Z 而渲染端期望 Y额外转 90 度if(meta.upAxisZ){gsNode.rotate({x:1,y:0,z:0,w:Math.cos(Math.PI/4)});}}这个对齐逻辑看着不复杂但调对花了我们两天。主要困难是不知道坐标系差了多少——重建结果不会告诉你它的坐标系是什么要自己拿一个已知物体试出来。我们用一只正方体盒子做标定物重建后看盒子哪个面朝上反推坐标系偏移。场景落地手机采集→平板重建→手机渲染完整链路分五步分布式同步预览文件直传素材文件直传 PLY拍摄指引分布式同步视角手机采集视频平板实时引导拍摄平板重建 3DGS手机加载渲染平板同步预览第一步手机采集平板引导手机开始拍摄预览帧通过分布式数据同步实时发到平板。平板上显示预览画面和拍摄引导覆盖度提示、路径指引。这一步用分布式数据同步因为预览帧小、要实时。// ArkTS手机端采集预览同步import{distributedDataObject}fromkit.DistributedKit;// 创建分布式数据对象同步预览帧到平板constsessiondistributedDataObject.create({bundleName:com.example.recon,sessionId:recon_session_001});// 预览帧回调里同步camera.on(frame,(frame:image.PixelMap){// 缩放到 480p 减少传输量constpreviewresizeToPreview(frame,480);constbase64encodeToBase64(preview);// 写入分布式数据对象平板端自动收到session.put(previewFrame,base64);session.put(captureProgress,computeCoveragePercent());});第二步素材传输拍摄完成后原始视频文件通过文件直传发到平板。这是端到端延迟的大头8-15 秒。我们在手机端显示正在传输素材到平板的进度条平板端显示等待素材到达。试过压缩视频再传能缩到 40-60MB传输降到 5-8 秒。但压缩后的视频重建质量下降SSIM 从 0.89 掉到 0.82。权衡后我们选不压缩接受 8-15 秒传输因为重建质量对我们更重要。第三步平板重建平板收到素材后开始重建。平板是麒麟 9030 Pro重建耗时比手机9030快约 30%。设备芯片重建耗时重建内存峰值手机麒麟 903014.2s1.8GB平板麒麟 9030 Pro10.1s1.6GB手机旧款麒麟 902022.5s2.1GB重建耗时波动 ±2 秒跟素材复杂度有关。内存峰值差异主要来自芯片内存带宽9030 Pro 带宽大峰值反而低一些中间数据不用频繁换出。注意一个硬约束同一时刻只允许一个重建 session。如果平板上已经有别的重建在跑新的 session 创建会失败。我们在平板端做了请求队列排队等重建资源。第四步重建结果传回手机重建结果PLY 文件通过文件直传发回手机。30-50MB 文件3-6 秒传完。这一步比素材传输快因为文件小。传输时附带坐标系元数据前面说的ReconResultWithMeta手机端加载时做坐标系校正。第五步手机渲染手机收到 PLY 后用loadGSNode加载渲染。加载耗时 0.5-0.8 秒跟文件大小有关。加载完成后用户可以在手机上交互式查看重建结果。渲染视角由手机 IMU 驱动用户转头场景跟着转。这里坐标系对齐就关键了——如果重建结果的前方向跟手机的前方向对不上用户面向物体时看到的是物体的侧面。端到端延迟汇总阶段耗时备注素材传输8-15s端到端延迟大头平板重建10-14s取决于芯片结果传输3-6sPLY 文件手机加载0.5-0.8s可忽略总计22-36s从拍完到可渲染22-36 秒的端到端延迟体验上不算好。用户拍完要等半分钟才能看到结果。我们试过在传输和重建阶段都显示进度条但用户反馈等太久。后来加了一个拍摄完成后自动开始处理的选项让用户放下手机等通知比盯着进度条体验好一些。踩坑与取舍坑 1分布式数据同步传大文件超时一开始我们用分布式数据同步传重建结果PLY 50MB频繁超时。分布式数据同步内部把大对象分片传输但分片机制对 50MB 这种量级处理不好网络抖动一下就整片重传。改成文件直传后稳定多了。文件直传底层走的是分布式文件系统有断点续传网络抖动影响小。教训分布式数据同步用来同步状态和轻量数据大文件走文件直传不要混用。坑 2坐标系没对齐导致渲染偏移前面说的竖屏拍摄旋转标记问题。手机竖屏拍的视频带 90 度旋转标记平板重建时没读这个标记重建结果侧躺着。渲染到手机上用户正面看物体物体侧面朝前。修复方法是在传输重建结果时附带采集设备的方向信息渲染端根据方向信息校正。但调对这个校正花了不少时间因为物体侧躺这个现象有多个可能原因——坐标系偏移、相机初始位姿错误、渲染视角设置错误——要逐个排除。坑 3设备掉线导致传输中断跨设备链路最怕设备掉线。手机放到口袋里信号断了或者平板息屏后 Wi-Fi Direct 断开传输中断重建结果丢了。我们加了断点续传和本地缓存。传输中断后已传的部分不丢设备重连后从断点继续。重建结果在平板上保留一份缓存手机重连后可以重新拉取。但这个机制增加了复杂度断点续传的边界 case 不少文件被部分覆盖、缓存过期等调试花了几天。坑 4两台设备时钟不同步分布式数据同步依赖设备间时钟同步。我们遇到一次时钟偏差 3 秒的情况导致分布式数据对象的版本号混乱手机端收到的是旧数据。HarmonyOS 有自动时钟同步机制但不是实时的偶尔会有几秒偏差。我们的解决方法是不依赖时钟做版本判断改用自增序号。这个坑不常遇到但遇到了很难排查因为现象是数据偶尔不对不是稳定复现的 bug。取舍什么时候值得跨设备跨设备链路引入了传输延迟和复杂度不是所有场景都值得用。我们的判断标准场景是否跨设备原因小物体重建摆件不跨设备手机重建 14 秒可接受大场景重建展厅跨设备到平板手机重建 60 秒不可接受批量重建跨设备到平板平板算力大排队快实时预览重建不跨设备传输延迟太大实时性做不到高质量存档重建跨设备到平板平板重建质量略好小物体在手机上直接重建就行14 秒等得起。大场景必须跨设备手机重建 60 秒以上用户等不了。批量重建比如商品目录里几十个物体要重建适合跨设备平板算力大排队快。小小注意一下下哦大文件传输用文件直传不用分布式数据同步采集预览帧用分布式数据同步实时性要求高数据量小跨设备链路必须处理坐标系对齐附带元数据设备掉线要有断点续传和本地缓存不能丢重建结果同一时刻平板只允许一个重建 session多请求要排队端到端延迟 22-36 秒产品层面要给用户合理预期素材传输是延迟大头压缩可降延迟但牺牲重建质量不依赖设备时钟做版本判断用自增序号我们在试两个优化方向。一是采集素材边拍边传拍完的同时素材也传完了省掉传输等待。技术上可行需要手机端边录边推流平板端边收边缓存。难点是视频流式传输的完整性校验断帧了重建会失败。二是重建结果在平板端预渲染低精度版本先传回手机高精度版本后台传。用户先看到模糊结果再逐步清晰。这个方案跟 Tiled 3DGS 的思路类似但跨设备实现复杂度更高目前还在验证阶段。如果端到端延迟能从 30 秒压到 15 秒以内跨设备链路的体验就过得去了。目前还在 22-36 秒区间继续调。

相关新闻

DeepSeek本地部署与集成方案选型对比:从命令行到可视化与办公插件

DeepSeek本地部署与集成方案选型对比:从命令行到可视化与办公插件

DeepSeek本地部署并非只有一种路径。从搜索结果看,社区已经形成了从命令行到可视化界面,再到办公插件集成的多种方案。不同方案在安装复杂度、交互体验和适用场景上差异明显,选型时需要结合自身技术背景和实际需求。 基础层:Ollam…

2026/10/12 15:00:07 阅读更多 →
计算机网络必须掌握的核心知识详解(一)

计算机网络必须掌握的核心知识详解(一)

本人为了复习计网写了这篇文章,主要讲述我认为必须掌握,面试中高频考点,开发中必须熟悉的计网知识,物理层和数据链路层的某些重要一点的知识也会讲解,根据我个人的学习和开发经验.一.计算机网络的体系结构1.网络的概念网络是由若干节点和连接这些节点的链路构成. 多个网络可以…

2026/10/11 3:56:16 阅读更多 →
干货: 路径的坑

干货: 路径的坑

路径的坑:基于项目根解析 vs 运行时 cwd 一个幽灵 Bug:同样的代码,换目录就跑不通 你用 os.getcwd() 或相对路径 "temp/" 存文件,在自己电脑上跑得好好的,换个启动方式(比如双击 .bat、任务计划、…

2026/10/11 7:33:08 阅读更多 →

最新新闻

机器学习入门四大实战项目:手写数字识别、声呐分类、垃圾短信识别与鸢尾花分类

机器学习入门四大实战项目:手写数字识别、声呐分类、垃圾短信识别与鸢尾花分类

简介:这份资源面向零基础或刚接触机器学习的小白学习者,围绕四个经典入门项目展开:手写数字识别、声呐目标分类、垃圾短信识别与鸢尾花分类,帮助读者在动手实践中理解分类任务的完整流程与常见算法思路。压缩包共13个文件&#xf…

2026/10/13 13:35:16 阅读更多 →
贪吃蛇AI实战:从状态编码到DQN训练,避开绕圈与撞墙的坑

贪吃蛇AI实战:从状态编码到DQN训练,避开绕圈与撞墙的坑

简介:这份资源是一套用 C/C 编写的贪吃蛇游戏人工智能实现,面向对游戏 AI、路径搜索与强化学习感兴趣的开发者与学习者,帮助理解如何让蛇在自动寻路中尽可能吃满整张地图。压缩包共 57 个文件,以 34 个 Python 源码为主&#xff0…

2026/10/13 13:35:16 阅读更多 →
GDAL 2.3.1 Windows预编译包使用指南:环境配置、格式转换与避坑实践

GDAL 2.3.1 Windows预编译包使用指南:环境配置、格式转换与避坑实践

简介:本资源为自行编译的 GDAL 2.3.1 Windows 64 位版本压缩包,面向从事 GIS、遥感影像处理与空间数据转换的开发者及研究人员。GDAL 是支持 GeoTIFF、JPEG、HDF4、HDF5、ECW、MrSID 等多种栅格与矢量格式的开源地理空间库,自行编译便于按需选…

2026/10/13 13:35:16 阅读更多 →
内网自建Git服务实战:CentOS 8 + Apache HTTP协议搭建轻量代码托管

内网自建Git服务实战:CentOS 8 + Apache HTTP协议搭建轻量代码托管

1. 为什么要在内网自建 Git 服务1.1 从一次代码托管迁移说起前段时间帮一个做嵌入式开发的小团队整理代码仓库,他们之前一直把代码放在公共托管平台上,项目本身不涉及什么敏感内容,但问题是每次拉取和推送都要走外网,办公室的网络…

2026/10/13 13:35:16 阅读更多 →
MySQL分区表详解:从原理到实操,一次讲透分区裁剪与选型

MySQL分区表详解:从原理到实操,一次讲透分区裁剪与选型

MySQL 分区表这功能,早年在社区里的评价一直两极分化。一边是"一张大表拆成小表,查询快到飞起"的爽文故事,另一边是"分区表性能还不如普通表、坑多得防不胜防"的劝退帖。两种说法我都见过,自己也踩过不少。做…

2026/10/13 13:35:16 阅读更多 →
数据结构期末试卷拆解:高频考点与手写算法提分策略

数据结构期末试卷拆解:高频考点与手写算法提分策略

简介:湖北大学《数据结构》2022—2023学年第一学期期末试卷(A卷),面向计算机相关专业本科生,适合期末复习、考研自测及教学参考。试卷为闭卷考试,覆盖判断分析题、简答题与应用分析题,重点涉及带…

2026/10/13 13:34:15 阅读更多 →

日新闻

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

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

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

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 阅读更多 →