北斗网格性能优化(六):L7 的水平微块与高度切片

空间分块把一个大区域划成若干可以独立生成、绘制、隐藏和回收的空间块。 切得好,一块就是一次 Worker 任务、一次实例化绘制、一个缓存条目;切得不好,包围体太粗、单次任务太重,前面所有优化都会被抵消。

L7 微块是 L7 层级专用的水平分组,高度切片是在它之上再按采样层切的一刀。 两者合起来把一根根竖直的格子柱拆成可以单独调度的小块。

这套北斗网格的做法是:一个水平微块每边跨 2 个 L6 步长,也就是 16×16 = 256 根格子柱;每根柱子按最多 32 个采样层分成一片,满片 8192 个实例。 微块的列号行号取自全局经纬度,不取自区域边界,所以相邻的两个基础块看到同一片空间会算出同一个编号。

这篇只讲 L7。L6 的切法完全不同 —— 它按区域预估工作量反推块大小,放在下一篇和缓存一起说。

阅读更多

北斗网格性能优化(七):Tile、缓存与资源回收

Tile 是一块可以独立加载、绘制和回收的空间数据,一个 Tile 可以包含成千上万个网格实例。 它把大区域拆成可管理的批次,让视口筛选、Worker 生成和 GPU Instancing 使用同一种处理粒度。

LRU(Least Recently Used)是一种优先淘汰最久没用过的数据的缓存策略。 地图浏览有很强的时间局部性 —— 刚离开的地方常常很快又要看;保留最近用过的 Tile,就能省掉重新生成和上传。

这套北斗网格的做法是:块离开活动集合后先尝试进缓存,进不去就直接销毁;缓存的准入同时受块数、网格数和层级三个维度限制,超出时按 lastUsedAt 淘汰最旧的;共享的单位立方体几何用引用计数,最后一个使用者退出才真正销毁。

分块决定一次工作有多大,缓存决定哪些工作可以复用,回收决定资源能不能长期保持可控。

阅读更多