很多应用的都会使用到地图控件,我们目前使用到地图的场景是规划无人机的飞行路线。最常见的是规划一块要飞行的区域,然后生成巡航的路线,最后用拍到的照片进行建模。有了模型后就可以获得场地的一些数字化信息。
我们的地图控件在规划路线时有很多的自定义 UI 需要展示,下面是我们的规划正射飞行的一张设计图:
数据流
下面展示自定义 UI 和地图源映射的过程:
整体的视图结构大概就是这样:
缺陷
这个方案的优势是将自定义 UI 的实现与具体的地图 SDK 隔离,当地图源切换时,自定义 UI 可以直接复用。但是这个方案也有一个固有缺陷:当地图持续响应用户交互,自定义的 UI 绘制会略有卡顿。
如果将 UI 通过地图 SDK 添加到地图上,自定义 UI 的绘制与地图的渲染发生在同一帧里。因此任意一帧里,自定义 UI 和地图的位置总是对应的,从用户的角度看就是图形的变换很顺滑。但是我们的选择的方案,自定义的 UI 变换前有两个步骤:收到地图区域变化通知,重新计算图形在地图上的平面坐标。假设手机没有性能问题,那么地图原生图层的绘制频率是 60Hz。当用户进行连续缩放时,地图的图层每秒绘制 60 次。用户感觉很顺滑。地图区域变化的外界通知的频率由于性能考虑会低于 60Hz,因此即便重新计算图形坐标、绘制可以在 1/60 秒完成,自定义 UI 的渲染频率还是会低于 60Hz。给用户的体验就是连续移动时,自定义 UI 没有那么跟手。
至于自定义 UI 的绘制延迟是否可以接受这就看各自的场景了。但是从我的测试结果看,虽然性能会差一些,但是大部分场景不会影响到用户的使用。