region-loading-delivery.md 4.6 KB

Issue35:低空精模分区调度与管道粗模专用(city-regions-v2)

正式页面 http://127.0.0.1:8000/#/cockpit 不变。当前运行配置使用 /gis/cad-bim/city-regions-v2/coarse-tileset.json + regionManifest:/gis/cad-bim/city-regions-v2/manifest.json。旧far-shell-v4资源保留作回退。

改造目的与内容

用户已确认远景不再卡顿,但低空横看全城精模处理后明显掉帧;本轮直接限制CPU侧内容数量和初始化处理并发,不再降低近景精度,也不把CPU瓶颈当作已实测证明。

  • 主粗树仅113个GE0内容,没有精模后代,无论相机高度/横向视野怎样变化都不能自行细化为3023精片。
  • 按原粗内容完整归属,拆113个精模区域;每区域1–115个已有GLB,总3023细片,全城30,172栋几何/纹理/座落不变。
  • 地面准入:相机视锥球可见 + 到区域球表面≤700m,已活跃区允许800m滞回。优先保留活跃区,最多2区/合计180内容/合计96MiB解码几何估算。
  • 一次只启动一个新区,前一个全部预计内容loaded、pending/processing清空且tilesLoaded后释放串行槽;粗树先实际render并tilesLoaded再允许启动精模区。细区中网络仍使用既有并发10/5,非每GLB逐个串行。
  • 细区隐藏预取:show=false/preloadWhenHidden=true,只对已准入的最多2区生效;完整内容loaded后显示。实际tileVisible/postRender确认后才能遮罩该区粗模。
  • 粗模采用每primitive全零_FEATURE_ID_0真实顶点属性+一行EXT_structural_metadata.region。运行只用公开tileVisible/content.getFeature/feature.show,实现当前区粗模遮罩;不改Cesium私有树,不全局隐藏远景。
  • unload/失败/方向移开立即清readymask、移除该区模型;失败15s后重试并输出既有engine失败状态。异步fromUrl晚到但已管道/退出时立即销毁;元数据请求随controller abort。
  • 管道视图:0精模准入,释放全部精模区,恢复粗模show;保留既有地形/粗模半透明,地面返回后按同一预算重载。
  • Viewer创建后立即登记到record,修复异步terrain/home采样期间unmount可能无法销毁Viewer的旧漏洞。Viewer销毁后返回的粗/精fromUrl结果也直接释放,不访问已销毁的scene.primitives;清理函数验证不重复销毁。

验证

区域资产证据:113粗模型与原far-shell逐triangle/normals/材质/节点变换一致;每顶点featureID=0,table.region与归属匹配;3023fine URI一对一不重不漏。粗模型加元数据后5,949,408bytes;原粗面数不变。复杂区域最大解码几何估算80,542,152bytes。估算不包含纹理/驱动/渲染临时占用,非GPU硬上限。

合成ENU相机 活跃区 精模内容cap 解码几何估算
(0,-1000,350) 3,12 25 14,078,664
(0,-1000,50) 3,12 25 14,078,664
(2000,1000,180) 8,34 54 32,724,960
(0,-1000,10000) 无 0 0

上述纯距离/预算模拟未加入真实视锥,运行额外剔除视锥外区域,因此不作为实际FPS。每个位置pipelineRegions=0。

算法回归脚本验证2区/180cap、96MiB估算cap、粗树未就绪不能启动精模、初始化返回不是ready、必须预计GLB全量loaded才放行下一细区、postRender可见粗模遮罩、定时刷新不闪烁、unload/失败恢复粗模、进入管道释放所有精模、异步晚到删除、视锥外区域释放串行槽。源码公开API审查核查了tileLoad/content.url、style先于tileVisible和feature.show setter语义。

既有T04配置、T21地形和视图条件回归及JS语法检查通过。当前只完成离线逻辑/资源检查;按项目规则跳过Web build/debug、服务器、浏览器及截图。没有实测CPU/GPU占用、FPS或真实启动时序,不宣称无感完成。

取舍与回退

区域整体替换意味着未完整驻留时继续看到粗模,复杂区可能更晚细化;细区prefetch all siblings保证完整粗归属被替换,但最多115片仍会消耗处理时间。方向转出/移动跨区可能重载,缓存实际压力需真机确认;粗模型数据集常驻不等于113GLB永久钉在GPU。

回退:运行配置URL改回 /gis/cad-bim/city-far-shell-v4/tileset.json,删除regionManifest,保持progressiveRefinement=true。旧模型资产不删;配置被git忽略需单独部署。回退单树将失去新的管道粗模专用行为,故只作为性能/功能回归排查使用。issue35保持open待低空/管道真机验收。