# 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保护。 ## 可复跑实现 - 生成:[assemble-instanced-city.py](<../../../../../tools/city-massing/assemble-instanced-city.py>) - 转换:[convert-instanced-city.mjs](<../../../../../tools/city-massing/convert-instanced-city.mjs>) - 安全共享:[instance-safe-primitives.mjs](<../../../../../tools/city-massing/instance-safe-primitives.mjs>) - 无损编码:[instance-buffer-codec.mjs](<../../../../../tools/city-massing/instance-buffer-codec.mjs>) - 混合层级:[build-progressive-instanced-city.mjs](<../../../../../tools/city-massing/build-progressive-instanced-city.mjs>) - 回验:[verify-instanced-city.mjs](<../../../../../tools/city-massing/verify-instanced-city.mjs>)、[verify-progressive-instanced-city.mjs](<../../../../../tools/city-massing/verify-progressive-instanced-city.mjs>) ## 已知实际情况 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]()。