summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/维护说明.md66
1 files changed, 66 insertions, 0 deletions
diff --git a/docs/维护说明.md b/docs/维护说明.md
index dbbf2ac..4b4621c 100644
--- a/docs/维护说明.md
+++ b/docs/维护说明.md
@@ -510,6 +510,39 @@ dotnet src/LivingVillage.Headless/bin/Release/net8.0/LivingVillage.Headless.dll
谣言子系统占比很小;P27 的收益集中在 Rumor 工作集路径,符合「隔离测量」的基准口径。
逐 tick NPC 快照分配属另一个课题(会触及不可变快照不变量),留给后续单。
+## P28:512 大图民居观感整改(P26 遗留)
+
+- **① 第二变体辨识度(确定性图集 + 纯绘制分支)**:P26 变体 B 在 512 整图 ~2px/tile 下不可辨,
+ 根因是挑檐与变体 A 同为近黑黛瓦、格栅窗与 A 横向窗差异在 2px 内被抹平。P28 给 B 独立
+ 配色/几何:`scripts/make-jiangnan-art.py` slot28 挑檐改为亮青灰瓦色阶(base 84,106,110 /
+ light 134,158,158,A 仍是黛瓦脊 slot8),slot29 木格栅窗改竖长比例(内窗 10x18,A 为 18x16
+ 横向),slot30 院门改绿双扇 + 青灰门楣;`VillageArt` 变体 B 再向上叠一层挑檐(该格为水面时
+ 不叠,避免屋顶压水)且向两侧各出一格,墙身统一为格栅窗。图集二次运行 byte-identical
+ (`jiangnan-world.png` md5 `e5aca186a25b8f8b78d37c0d3ef167b5`)。1 tile≈2px 实测:
+ A 屋脊 `[46,60,54]` vs B 挑檐 `[68,101,82]`(ΔG≈40),墙线 A 暖 `[154,125,97]` vs
+ B 冷 `[118,140,115]`,肉眼可分(对照 4x NEAREST 裁剪)。回归
+ `VariantBRoofPaletteIsClearlyLighterThanVariantA`:解码 world 图集断言 slot28 平均亮度
+ > slot8 + 15。
+- **② 密度/聚落层次(仅大图 mapgen 参数)**:`MapGen.Params.ExtraRiversideHouses` 10 -> 16,
+ 额外民居宽度按 2/3/4 加权(2=附属小筑 / 3=民居 / 4=大宅)。512x384 seed4242 由 18 -> 24 座
+ (变体 A 11 / B 13;宽度 2×8、3×10、4×6),不再是单一等距 3x2。默认图仍为 0 且不进入
+ 大图分支、不消耗 `structureRng`,故 **64x48=6042052、256x192=1284656962 逐字节不变**
+ (`DefaultSizeChecksumsArePinned`)。回归 `LargeMapHouseDensityHierarchyOnlyGrowsLargeMaps`。
+- **③ 取证钩子(仅证据路径,不改语义)**:`LV_MAPGEN_FIT_WIDTH/HEIGHT` 把整图按指定像素目标
+ 再做一次真实离屏渲染(1024x768 对 512x384 恰为 2px/tile);`LV_MAPGEN_NIGHT=1` 时以 23:30 的
+ 真实 `WorldTint` + golden/moonlight veil 出夜景整图,与 `DrawWorldView` 共用同一套纯函数。
+ 全部为真实渲染帧,非编辑器合成/外表图像。
+- **回归/门槛**:Kernel **92** / Desktop **144** 全绿;Release build 0 警告 0 错误;
+ `final_digest=953775FAEB2FDDE97289491AA260BD8D390C571E48A7A13AD2CB6FB7124F7F6C`
+ 3 次一致、`performance_determinism=PASS`。
+- **取证** `/tmp/opencode/lv-p28/art/`:`p28-map-512x384-seed4242-day.png`(512 整图真实渲染
+ 3072x2304)、`p28-map-512x384-seed4242-2px-day.png`(1024x768 真实帧,1 tile=2px)、
+ `p28-variant-pair-ab-4x-day.png`(A/B 相邻民居 4x NEAREST 对照,裁 tile x184..214 y186..196)、
+ `p28-village-core-4x-day.png`(村核 4x)、`p28-village-density-2x-day.png`(密度总览),
+ 以及同名 `*-night.png`(夜景:整图 + 2px + A/B 对照)与 `p28-night-village.png`
+ (512 夜巡真实帧,HUD 在屏、民居/石板路清晰)。白块回归 4 张夜景整图 + 571 张夜巡帧
+ 0 命中。
+
## 已验证命令
```bash
@@ -641,6 +674,34 @@ for pair in day:12.0 night:23.5; do name=${pair%%:*}; hour=${pair##*:}; \
# P26 夜景白块回归(方斑核对,0 命中)
python3 scripts/check-no-white-blocks.py /tmp/opencode/lv-p26-art/night
+# P28 512 整图真实渲染(3072 整图 + 1024x768 恰 2px/tile;night=1 走 23:30 tint+月光 veil)
+for night in 0 1; do extra=""; [ "$night" = 1 ] && extra="LV_MAPGEN_NIGHT=1"; \
+ dir=/tmp/opencode/lv-p28/art/map; [ "$night" = 1 ] && dir=/tmp/opencode/lv-p28/art/map-night; \
+ timeout 180 xvfb-run -a -s "-screen 0 1280x720x24" env LV_MAPGEN_SHOT=1 \
+ LV_MAPGEN_WIDTH=512 LV_MAPGEN_HEIGHT=384 LV_MAPGEN_SEED=4242 \
+ LV_MAPGEN_FIT_WIDTH=1024 LV_MAPGEN_FIT_HEIGHT=768 $extra LV_RECORD_DIR=$dir \
+ dotnet src/LivingVillage.Desktop/bin/Release/net8.0/LivingVillage.Desktop.dll; done
+# 两个变体 4x NEAREST 裁剪对照(从 1024x768 真实帧按 2px/tile 裁 tile x184..214 y186..196)
+python3 - <<'PY'
+from PIL import Image
+for tag, p in (("day","/tmp/opencode/lv-p28/art/map"), ("night","/tmp/opencode/lv-p28/art/map-night")):
+ im = Image.open(f"{p}/p28-fit-1024x768-seed4242.png").convert("RGB")
+ c = im.crop((184*2, 186*2, 214*2+2, 196*2+2))
+ c.resize((c.width*4, c.height*4), Image.NEAREST).save(f"/tmp/opencode/lv-p28/art/p28-variant-pair-ab-4x-{tag}.png")
+PY
+# P28 夜景白块回归(4 张整图 + 571 张夜巡帧,0 命中)
+python3 scripts/check-no-white-blocks.py /tmp/opencode/lv-p28/art/map-night
+python3 scripts/check-no-white-blocks.py /tmp/opencode/lv-p28/art/night-raw
+
+# P28 512 夜巡真实帧(seed 42;默认桥/门巡游路点,夜景 23:30)
+timeout 220 xvfb-run -a -s "-screen 0 1280x720x24" env LV_AUTOPLAY_SAMPLE=1 \
+ LV_RIVERSCAPE_TOUR=1 LV_RIVERSCAPE_WIDTH=512 LV_RIVERSCAPE_HEIGHT=384 \
+ LV_RIVERSCAPE_SECONDS=60 LV_AUTOPLAY_START_HOUR=23.5 LV_NPC_VISIBLE_LOG=1 \
+ LV_AUTOPLAY_RECORD=1 LV_RECORD_EVERY=20 LV_RECORD_NAME=p28-night- \
+ LV_RECORD_DIR=/tmp/opencode/lv-p28/art/night-raw \
+ dotnet src/LivingVillage.Desktop/bin/Release/net8.0/LivingVillage.Desktop.dll
+# 代表帧 p28-night-10100.png -> art/p28-night-village.png
+
# P20 第三步:默认生成器世界的昼夜巡游录制(真走位,含桥面行走帧;p20c-* 命名)
for pair in day:12.0 night:20.75; do name=${pair%%:*}; hour=${pair##*:}; \
timeout 150 xvfb-run -a -s "-screen 0 1280x720x24" env LV_AUTOPLAY_SAMPLE=1 \
@@ -724,4 +785,9 @@ python3 scripts/check-no-white-blocks.py evidence/night-run
- `/tmp/opencode/lv-p13-evidence/`(P14 修复后重录:`day-panorama.png`、`night-lantern.png`、
`day-night-compare.png`、`chimney-closeup.png`、`night-lantern-closeup.png`、
`white-block-check.txt`、`day-run/`、`night-run/`;同步一份到 `evidence/`)
+- `/tmp/opencode/lv-p28/art/`(P28:`p28-map-512x384-seed4242-day.png`/`-night.png` 512 整图、
+ `p28-map-512x384-seed4242-2px-day.png`/`-night.png` 1024x768 恰 2px/tile、
+ `p28-variant-pair-ab-4x-day.png`/`-night.png` A/B 4x 对照、
+ `p28-village-core-4x-day.png`/`-night.png`、`p28-village-density-2x-day.png`/`-night.png`、
+ `p28-night-village.png` 夜巡代表帧、`night-raw/` 571 帧;工作区内不入 git)
- `artifacts/perf-independent/<TS>/`(digest 3 联测回读)