多图使用指南与最佳实践
在 Mega 应用开发中,是否应该在一个定位库中添加多个地图(Block),是一个常见的问题。错误地使用多地图不仅不会提升应用能力,反而可能导致性能下降和定位跳变。
本篇将引导您正确理解和使用多地图功能,避免常见误区。
为什么需要避免添加多个地图?
核心原则:不要为“扩大覆盖范围”而添加多个地图。
在绝大多数情况下,一个定位库应该只添加单个地点的 Mega Block 地图。以下是一些常见的错误用法,务必避免:
错误场景 A:多区域
- 想法:为一个景区彼此相连的“A 区”、“B 区”、“C 区”分别创建地图,然后在应用中一次性将这三个地图添加到库里,希望用户在景区中移动时可以无缝切换。
- 问题:这样建出来的三个地图之间在空间坐标上是没有数学关联的,互相之间相互独立。由于各自坐标系的不一致,无法实现在移动中的无缝切换,因此在区域交界处会发生定位跳变。
- 解决:对于这类场景,最佳的处理方式是按照 超大空间数据采集方法 中介绍的方式采集“A 区”、“B 区”、“C 区”,并保证彼此之间有足够的重叠区域。按照 超大范围融合任务 中介绍的方式进行建图。此时会生成包含上述所有区域在内的统一坐标系的单一 Block 地图,可以将这个地图添加到定位库中。
错误场景 B:多地点
- 想法:对一个地点的商场创建一个地图,再为另一个地点的同名商场创建一个地图,希望在一个应用中能同时使用。
- 问题:这会严重拖慢定位速度。设备在定位时,需要同时比对库中所有地图数据,计算量剧增,导致初始化时间变长。用户在同一时间只能处于一个商场,加载另一个商场的地图是资源浪费。当某个商场请求量大时,也会拖慢另一个商场的请求响应时间。
- 解决:为不同地点的商场创建不同的定位库,每个库只添加一个地图。在应用中根据用户当前的位置,动态访问对应地点的定位库。
错误场景 C:跨时间
- 想法:同一个地点,在白天进行采集并建图,在晚上也进行采集并建图,然后将白天和夜晚的地图添加到库中,希望用户在同一地点的不同时刻都有一致的体验。
- 问题:这个场景与错误场景 A 是类似的,分别的建图结果之间是无法保证空间位置关系的。
- 解决:按照 超大范围融合任务 中介绍的方式将白天和夜晚的采集放到一起进行融合建图。将最终生成的单一 Block 地图添加到定位库中。
错误场景 D:跨版本
- 想法:同一个地点,已经建过一个版本 A 的地图并使用中,在后续的运营过程中新建了更新的版本 B 的地图并添加到原定位库中,希望在不重新发布应用的情况下实现对新地图的使用。
- 问题:由于是同一个地点的不同版本地图,在定位时会出现定位结果在两个不同版本数据中跳变的情况。
- 解决:按照 无损全量更新 中介绍的方式对旧版本的建图进行升级,保证地图数据版本更新的同时维持坐标系不变。在添加完更新后的地图之后,务必从定位库中删除原版本的地图。
错误场景 E:补充更新
- 想法:同一个地点,已经建过一个版本 A 的地图并使用中,在后续的运营过程中由于局部区域发生变化或者需要对小范围区域进行补采,此时创建了新图 B 并添加进原定位库中,希望在不重新发布应用的情况下实现对新地图的使用。
- 问题:新采集的小区域地图 B 与原来的地图 A 之间没有空间坐标关联,位于新旧数据之间的体验将发生定位跳变。
- 解决:按照 补充更新 中介绍的方式对旧版本的建图进行补充更新,保证新采集的小区域与旧地图维持坐标系不变。在添加完更新后的地图之后,务必从定位库中删除原版本的地图。
总结:试图用多个小地图拼接成一个大世界,不适用于 Mega 的高精度地图。Mega 的设计哲学是一个空间连续、坐标统一、时空一致的高精度三维表示。
真正需要多图的场景
那么,什么时候才真正需要在一个库里添加多个地图(Block)呢?主要场景是 “并行任务” 或 “多空间选择”,而不是 “空间拼接”。
场景一:多空间选择
- 描述:您的应用服务于同一个地点的多个完全不同的区域。但受限于建筑结构或采集实践中的问题,无法将这些区域在数据上完全联通起来,用户可能需要先选择自己所在的区域。例如,大型医院的不同楼层。
- 实现:在用户选择区域后,利用这个先验信息动态激活该地点对应的单一地图。在同一时刻,定位库里仍然只有一张地图在参与计算。当用户跨越到新的区域时,需要重新确认区域的选择。
场景二:并行任务
- 描述:您的应用需要同时处理两个或多个独立的、已知的物体跟踪任务,且这些物体位于同一地点但彼此没有关联、特征差异巨大。例如,博物馆中的多个展览品。
- 实现:在这种高级场景下,可以为每个物体创建一个独立的地图,然后将这些“物体地图”添加到一个定位库中。但需注意,此时定位性能将取决于定位库中添加的物体数量。如果物体数量巨大,您可能需要在定位性能与定位库数量之间做一个权衡,可以将物体分类并创建多个定位库分别添加。
使用多图时渲染端的行为
需要注意的是,使用多图定位时,不同平台和版本的 3D 渲染行为有所不同。
最佳实践建议
如果您确实属于 真正需要多图的场景 中描述的场景,或者必须使用多图的情况,可遵循以下原则:
- 按需激活:在用户做出选择或进入特定区域时,在发送定位请求时提供相应的先验信息,并仅加载对应的 3D 内容。
- 动态切换:提供清晰的 UI 让用户选择场景。加载新地图对应的 3D 内容前,先卸载旧地图对应的 3D 内容,以释放内存。
- 状态管理:在代码中明确管理当前激活的地图,监听定位结果中的 Block ID,以区分不同地图的定位反馈。
- 性能监控:在使用多地图时,密切关注设备的内存占用、定位延时和功耗,确保应用在目标设备上流畅运行。
总而言之,对于绝大多数应用,坚持“一个场景,一张地图”的原则,是保证 Mega 定位性能和稳定性的最佳选择。