Skip to content

SCAPI Skyline Project v0.1.156

Latest

Choose a tag to compare

@DionysusDWI DionysusDWI released this 29 Sep 13:24
· 6 commits to main since this release

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 —— 既偏快、又是"越高越快");
  • 范围到近地平线:CloudMaxDistance 6000 → 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.