Repository navigation
SCAPI Skyline Project v0.1.156
[v0.1.156] - 2026-09-29
第一百六十版:稳定性根因 + 用户点名的一条观感要求 + 一条并行路线的定论。相对 v0.1.155 的变更:
1. 缺陷(长期存在,notes/263 先发现现象、本轮定位到根因)
区块表 Terrain.ChunksStorage 是线性探测的开地址表(65536 槽),而 Remove 直接把槽位置空:
- 置空会在探测簇中间留一个洞 ⇒ 洞里原本经过的 key 从此
Get返回null; - 引擎以为"这个坐标没加载" ⇒
AllocateChunk的防重检查失效 ⇒ 同一坐标被分配两次; FreeChunk在位序上先碰到哪个删哪个 ⇒ 表里留下不在册 / 已Dispose的条目,
每个还带着 128 个 slice 几何与 VB/IB ⇒ 只增不减(用户内存红线那条风险的真根因之一)。
实测现象:notes/263(重负载 1.5 h 后 arrayNonEmpty 453 > allocated 452)、
notes/153(堆里 1,092 个 TerrainChunk,在册只有约 202)。
2. 修法:回移删除(Knuth TAOCP 3 §6.4 Algorithm R)
删掉槽 i 后把同一探测簇里靠后的元素往前挪,洞顺着簇推到簇尾 ⇒ 删除后簇内不留洞,
其余 key 的探测链完好。移动判据(i <= j 分支专门处理"探测跨表尾回卷"的簇):
bool move = i <= j ? (home <= i || home > j) : (home <= i && home > j);开关 skyline.ChunkTableBackwardShiftRemove(默认 true,false = 旧语义,仅供对照/回滚)。
表的装载率极低(455 / 65536)⇒ 簇长个位数,代价可忽略(实测 removeMs 0.003 ms,与旧语义同)。
3. 两条确定性验收(不靠"跑很久看症状")
| 判据 | 内容 | 实测 |
|---|---|---|
skyline.ChunkTableRemoveProbe() |
三条方向性用例:3 个同 home 槽条目删第一个、64 条目单簇删中间、回卷簇(home=65535)删第一个 | 旧语义丢 2 / 32 / 2 条,新语义丢 0 / 0 / 0 |
skyline.ChunkTableRandomizedSelfCheck(seed, ops) |
随机化对拍(默认 2 万次插删、键域含跨表尾回卷与小域强碰撞);口径 = 阴影 Dictionary 语义对照 + 可达性 + 非空槽数 == 阴影数 + 无重复坐标 |
新语义 0 mismatch / 0 不可达;把开关切回旧语义 ⇒ 389,377 mismatch / 191,022 条不可达(证明该判据不是空洞的) |
另加 chainBreakingRemoves("簇中删除"计数)把缺陷生成变成可数:强碰撞键域下 968.75 次/千次删除;
真实负载下这个比例低得多(notes/285 §4 的 3,100 次删除里 shiftMoves=0 ⇒ 删除多落在簇尾)。
4. 用户口径 4.4:体积云三条(notes/286)
- 三层带:云海 300–600 m、卷云 850–1000 m、高空薄云 1300–1700 m(原来只有两层);
- 越高越慢:风默认 2.6 / 1.6 / 0.8 m/s(原来 6 / 12 —— 既偏快、又是"越高越快");
- 范围到近地平线:
CloudMaxDistance6000 → 24000 m(仰角 2.2° → 0.55°),并新增
空气透视混融CloudFadeDistance(2200 / 3000 / 3600 m)——
8 步固定步长下掠射视线的od会饱和,把地平线糊成一片浅灰白(用户报的"白色化遮罩"),
混融把远处云色混向天空底色即可修掉:发白像素 30.34% → 0.0%、彩度 44.78 → 56.41。 - 云影侧另加
LodCloudShadowTintEnabled(默认关):打开即高饱和平色(黄绿),便于看清云影落点。 - 代价实测:关垂直同步 + on/off 配对交替 ⇒ 102.15 vs 102.00 fps(−0.15%),三层云几乎不花钱。
5. lockstep 批调度:三档实测,判据③未达 ⇒ 默认保持关(notes/284)
ParallelLockstepScheduling(0 旧贪心 / 1 连通分量 / 2 按 worker 装箱)与 ParallelLockstepComponentMax(默认 4):
| 档 | 壁钟(串行 → 并行 2) | 回退率 | 批数 |
|---|---|---|---|
| 旧 I2 | 3.37 → 3.15(+6.5%) | 86.2% | 583 |
| I2' 连通分量(审计批准版) | 3.03 → 2.86(+5.6%) | 97.9% | 71 |
| 按 worker 装箱 | 2.81 → 2.79(+0.7%;复跑 −32%) | 99.0% | 32 |
判据①②(六不变量含注入、交叉轮次哈希逐位相同)全 PASS;③ 中位改善 ≥15% 三档都没达到
⇒ 按审计规则 ParallelLockstepWorkers 默认保持 0(关)。本轮还抓出并修掉两个真 bug
(bbox 判据误用于装箱档 ⇒ 468 批全弃;装箱跨列冲突漏查 ⇒ 260 批被断言拦下)。
6. 门禁与文档
门禁 26 PASS / 0 FAIL / 0 SKIP(新增 chunk-table-remove-chain、chunk-table-randomized,
并把"三层云 / 越高越慢 / 24 km / 混融距离 / 三层风"写进默认值漂移门);
构建 0 警告 0 错误;README 精简到 9,968 字符(上限 10000)并把本版三条写进能力清单。
审计:CC 121304Z / 125037Z / 130316Z 三轮裁定,发现全部闭环(未闭环 0 条)。
Relative to v0.1.155: chunk table removal no longer cuts other keys off (backward shift, with a randomised differential gate that shows one hundred ninety thousand unreachable entries under the old semantics); three cloud bands with wind that slows as it rises, raymarch range 6 to 24 km and an aerial blend that removes the pale horizon mask (washed out pixels 30.3 to 0.0 percent); lockstep batch scheduling available in three variants but off by default because none reached the fifteen percent wall clock bar.