高尔夫球场里多半没有稳定的手机信号,地图却要随时算出每一杆的距离、落点和过水与否——这件事由离线地图引擎完成。它是把球场数据、渲染和几何查询全都放在设备本地的软件模块,不向服务器请求任何东西,直接回答"这一杆打多远、过不过水、落点安不安全"。
1. 两种模型,解决两种问题
在线地图是"请求—响应"模型:客户端发坐标,服务器回瓦片或路线。离线地图是"本地查询"模型:数据已经在设备里,程序直接算。
差异决定了它们各自关心什么。在线地图关心连通性和拓扑——节点、边、道路等级。离线地图关心区域和距离:果岭在哪、障碍区前后沿、当前位置离它们多远。球场的数据模型和路网不是一回事,这一点决定了引擎要按"区域加距离"来组织,而不是按"连通性"来组织。
2. 离线引擎由三层组成
数据层:球场数据包,单洞通常压到 100KB 量级,18 洞不足 1MB;
渲染层:把要素画到屏幕;
几何查询层:算测距、判断落点、识别障碍——真正产生价值的是这一层。
数据层决定了"能不能算",几何查询层决定了"算得对不对"。只把地图渲染出来、却拿不到对象坐标,等于只有眼睛没有脑子:画面上有水,但程序问不出"水障碍前沿在哪"。
几何查询层能不能发挥作用,取决于球场数据的维度齐不齐:发球台(红 / 白 / 蓝 / 黑 / 绿)、果岭前沿与后沿、障碍区前后沿、洞号与标准杆、果岭高程与球场专用等高线。这几类决定了"能算什么"——缺了障碍区前后沿,就算不出"这一杆能不能过";只有果岭中心一个点,落点判断同样失效。
3. 为什么球场硬件必须离线
球场上手机信号弱,联网并不可靠;而测距、定位要常驻、要低功耗。把地图引擎做进设备,不依赖网络与手机联动,才能在每一洞稳定工作。
这也解释了为什么离线方案不能简单挪用通用在线地图:通用地图为"联网取数"设计,缓存只是补充;球场引擎从一开始就要假设"没有任何网络"。
4. 资源预算要分三笔算
把离线引擎塞进嵌入式芯片,存储要拆成三块,不能合成一个数报:
球场数据包(Flash 或外置存储);
渲染缓冲峰值。
第三项常被漏掉,因为静态占用和整场渲染时的峰值不是一回事。作为量级参照,iMLite Golf 把球场引擎做到 ROM 低于 80KB、RAM 低于 20KB,可在 ARM M4 这类 MCU 上常驻。
5. 压缩是有损的,边界要写清楚
100KB 这个量级靠要素取舍与坐标量化换来。0.5 码是果岭高程的精度口径,不是画面精度的承诺,两者不要混着报。
还有一条边界要写进设计:离线地图能渲染、测距、做决策;实时路况、天气这类外部数据仍要联网才有。笼统说"支持离线"而不加限定,问题往往到量产才暴露。
50