instancing-delivery.md 4.0 KB

Issue35 实例化优化:实施与验收记录

本记录为当前实施状态,不表示运行态完成。正式入口固定为 http://127.0.0.1:8000/#/cockpit。

方案与约束

当前有效7批次30,159栋,按每批manifest关联的座落计划筛选;可复用template楼栋6,097栋。近景13栋含卫星屋顶影像,沿用旧v6/v14分支,不经过无纹理实例化重导出。

  • 仍使用既有Blender模板、0.6 LOD0减面、确定性palette和座落/heading/XY比例。
  • 三角预算按展开后的实际实例数量计算:每内容≤20,000 triangles /60,000 vertices。
  • 每个新粗精对拥有完全相同buildingIds;单栋>20k导致的整个source cell使用既有已验收分片,最终层级必须证明实际URI可达,不能仅统计fallback IDs。
  • 对mesh/material相同的重复构件按primitive分组;positive非均匀scale下,shader直接scale法线与inverse-transpose法线dot必须≥0.999999,否则保留普通TRS。
  • 每个实例组添加8个从不被triangle索引引用的包围顶点,使POSITION accessor bounds包含所有旋转缩放副本;不形成可见面。回验实际Cesium translation-only command bounds覆盖所有indexedvertices。
  • 无损EXT_meshopt_compression压缩实例数据;引擎已有支持,不增加依赖或修改node_modules。
  • 只采用候选总bytes小于同source cell旧fine总bytes且primitive结构数不大于旧fine总primitive数的cell;其余旧branch保留。
  • 新远景层使用≤20k的whole-cell LOD1,不直接复用74个超大粗组;局部coarse统一camera gate,fine仍局部球,防止整组部分内容被抛掉。非leaf转换为sphere/GE1e6保持原连续树culling保护。

可复跑实现

已知实际情况

80片来源样本:275实例组/864构件放置;压缩后15,004,560→14,687,440bytes。该数比较的是来源中间输出,不能替代与旧部署版本的比较,更不是FPS。

严格将每栋RS完全烘焙后共享率为0,因此不采用。i3dm不是非均匀scale法线问题的可靠替代,未采用。旧74粗组按空间包含归组会误归属并可能整组消失,候选未部署。

单元回归通过:安全法线/实际TRS/保守commandbounds/unusedvertices/无损meshopt/斜面与morph拒绝。Blender全城来源当前运行中,后续必须收集job结果、完成实际GLB回验和最终树检查后才接入。

全城候选最终结果

Blender来源导出完成:30,159栋、529 source cells,16个超预算cell保留原分片回退。安全构件转换输出2,590 pairs,4,473栋实例化构件、25,076次实例放置;候选总GLB字节490,953,324→482,784,168,但输出节点13,512→16,880,说明重复材质primitive碎片会抵消节点收益。

完整渐进树离线回验通过:30,172栋(含13栋近景)、6,575内容,530远景/3,022局部粗/3,023精内容,最大展开19,991 triangles,所有回退可达、粗精建筑ID一致、实例变换/法线/保守command bounds通过。但严格接入条件要求每个cell候选字节更小且primitive数不增加;本轮0个cell通过,故实例化候选不接入正式配置,避免增加Cesium绘制primitive。详情见instancing-optimization-result.json与progressive-instanced-v1.json。