diff options
| author | Somhairle H. Marisol <[email protected]> | 2026-09-22 11:33:23 +0800 |
|---|---|---|
| committer | Somhairle H. Marisol <[email protected]> | 2026-09-22 11:33:23 +0800 |
| commit | 941642f4e620fdfe84b01f44079cc5c79574743e (patch) | |
| tree | dfdfa732e75c2773aa919bc44ba9ce0353084fc5 | |
| parent | 7cb699bb7ac6cddb4cb33ede7c6f8962a3b60565 (diff) | |
| download | living-village-941642f4e620fdfe84b01f44079cc5c79574743e.tar.gz | |
docs: P28 512 大图民居观感整改小节(变更点/取证命令/锁定 checksum)
| -rw-r--r-- | docs/维护说明.md | 66 |
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 联测回读) |
