跳到主要内容

二维实线距离软边

line-blur 控制向线内衰减,保留真实端帽和单次透明度合成

当匹配SDK的commonPlanarLayerComposition为true时,墨卡托零pitch/roll、无terrain/extrusion的共同二维画面允许影像、背景、图文、热力及既有静态线面效果按完整图层顺序组合。本文旧阶段关于“媒体组合拒绝”的限制在此共同二维范围内由该能力取代;自定义线动画、倾斜/球面/地形及其它未实现材料组合仍保持各自限制。重排和兼容diff保留身份/缓存/在途请求/淡入时钟;所有素材、联合几何和纹理预算均先验证再发布。参见二维图层合成。

核心已实现并推送,能力为 commonLineBlurSolid;同一共同脚本 27 项及真实像素已通过 native/main/Worker;匹配开发 SDK 0.3.0-dev.3da09ace 已通过逐文件长度/SHA、Linux/Android/JNI 与 22 份近期共同脚本核对;正式发行、设备和其它组合仍待完成。line-blur 默认 0,接受非负有限 CSS 数值,最大 16;line-width 保留既有 24 上限。支持属性、paint feature-state/global-state、类型、词法惰性及连续 zoom。全层软边值为 0 时严格使用既有实线/拓扑路径和原预算。

非零软边按真实轮廓距离向线内衰减,分母为 blur CSS 长度加一个物理像素对应的 CSS 长度。软边不向外扩高斯光晕;细线中心也可能随 blur 变淡。butt/square 端头的横切边只裁切,不作软化种子;square 延伸部分的两侧继续软化,与同宽直段使用相同距离衰减。round 端头按径向软化。连接处使用真实轮廓;此独立实现不宣称与 MapLibre 逐像素相同。

import { map } from 'sqsmap';
map.setStyle(null);
await map.sqs.flush();
map.setProjection({type:'mercator'});
map.jumpTo({center:[116.4,39.9],zoom:13,pitch:0});
await map.sqs.flush();
map.addSource('route',{type:'geojson',data:{type:'Feature',id:1,
  properties:{blur:4},geometry:{type:'LineString',
    coordinates:[[116.38,39.9],[116.4,39.9],[116.4,39.92]]}}});
map.addLayer({id:'route',type:'line',source:'route',
  layout:{'line-cap':'round','line-join':'miter'},paint:{
    'line-color':'#0060ff','line-width':8,'line-opacity':0.5,
    'line-blur':['coalesce',['feature-state','blur'],['get','blur']]
}});
await map.sqs.flush({render:true});
map.setFeatureState({source:'route',id:1},{blur:8});
await map.sqs.flush({render:true});

非零软边先按原要素对真实网格求覆盖并集,再一次合成颜色与 line-opacity,避免折角相邻三角反复混合半透明颜色。三种 cap/join、稳定闭合 LineString、Polygon 环及准入的 offset/translate 已复用真实拓扑。保留原 ID、filter/sort 和同层 0/非零软边交错次序。查询按真实外包络保守命中,淡色边也可能命中;不按像素透明度拾取。

当前范围只接受稳定、无非相邻网格内部重叠的几何。自交、同原要素部件相互覆盖、退化或不稳定短段、不能形成稳定真实轮廓的情况明确拒绝。合法圆端帽的内部 T 接缝先拆分子边并配对去除;不同部件之间的部分共享接缝仍拒绝。同原要素各叶解析出不同 RGBA(含透明度)或 blur 也拒绝。blur 非零时,正内槽、line-pattern、dash/gradient/animation/pitch3D/globe/media 组合未接通;blur 为 0 时保留对应旧路径及旧限制。

实际预算对所有未替换的驻留通道与候选软边通道累计计算:最多 256 个可绘制记录,包含混合层的 0 软边记录。正软边按连续的原要素组共用一次 mask,每组最多 256 条全部真实轮廓边。累计 ROI 物理像素数 × 软化轮廓边数最多 1 亿次距离比较;端点扫描、拆边、边配对和稳定性检查累计最多 200 万。实际生成顶点(含 ROI 合成顶点)累计最多 100 万,综合实际挤出含 AA 最多 2048 CSS 像素;每帧最多 256 个 render pass、512 次 draw。

目标按 64 字节/物理像素加三份 256 字节对齐行填充保守核算,再与几何、轮廓纹理和 uniform 合计不超过 512 MiB。物理尺寸包含 DPR。MVT 全图最多 64 块,并对未知要素的 width/offset/join 与普通 AA 保守扩界;blur 本身不增大外部包络。source、state、global、paint、相机、视口、DPR 与投影候选提交前完整预检,失败保留旧数据、画面、资源队列和实例身份。未选中的未来分支保持惰性,只有实际进入超预算分支时才拒绝。

核心已通过 5 项定向 CPU、一个串行实际 GPU 用例及 WASM 定向检查。同一共同脚本 27 项与真实像素已通过 native/main/Worker;实际 GPU 覆盖向内软边、细线中心、半透明 L 角单次混色、三端帽、square 延伸衰减、DPR/rotation/offset/translate、混合排序、保守查询与失败回滚;64 块 MVT 和候选 DPR 失败也保留旧状态。共同脚本和完整网页已通过 native/main/Worker 匹配验收;匹配开发 SDK 0.3.0-dev.3da09ace 已通过逐文件长度/SHA、Linux/Android/JNI 与 22 份近期共同脚本核对;正式发行、设备和其它组合仍待完成。设备、移动/iOS、外机、完整组合、MVT 跨片接续与正式发布继续父任务。

本次原生 headless 读回使用 sRGB 目标,MapView 使用 UNORM 目标。真实像素验收按目标编码将 RGB 统一到 sRGB 后比较,alpha 保持原值;不直接将不同编码的原始 RGB 字节当作软边差异。

参考MapLibre 官方 line-blur 规范,引擎由 SqsMap 独立实现。