summaryrefslogtreecommitdiff
path: root/docs/维护说明.md
diff options
context:
space:
mode:
authorSomhairle H. Marisol <[email protected]>2026-09-21 20:22:31 +0800
committerSomhairle H. Marisol <[email protected]>2026-09-21 20:22:31 +0800
commit19f07747112cb8797596e862771b794ae739cdff (patch)
treeee58f03278eeb0cfe66c4a0e5a3df3eabd014585 /docs/维护说明.md
parent6f58a9d1bf9aa2767fdd8fe79762e3ae7c6eeffc (diff)
downloadliving-village-19f07747112cb8797596e862771b794ae739cdff.tar.gz
docs: 记录 P13 动画语义与确定性证据命令
- 维护说明更新为 Desktop 75/75、Kernel 79/79 - 新增动画语义小节(图集布局、cellIndex、各帧 tick 窗口) - 新增 P13 证据命令(Xvfb 白天/夜晚录帧 + 接触表脚本) - 新增 scripts/make-animation-evidence.py(镜像渲染端帧数学, 从真实图集生成确定性接触表),忽略 evidence/ 输出目录
Diffstat (limited to 'docs/维护说明.md')
-rw-r--r--docs/维护说明.md36
1 files changed, 35 insertions, 1 deletions
diff --git a/docs/维护说明.md b/docs/维护说明.md
index de5698a..6978a9a 100644
--- a/docs/维护说明.md
+++ b/docs/维护说明.md
@@ -1,6 +1,6 @@
# 维护说明
-结论先行:主分支保持 0 警告 0 错误 + Desktop 69/69、Kernel 50/50 全绿;性能基线
+结论先行:主分支保持 0 警告 0 错误 + Desktop 75/75、Kernel 79/79 全绿;性能基线
final_digest 固定 953775FAEB2FDDE97289491AA260BD8D390C571E48A7A13AD2CB6FB7124F7F6C。
本文记录模块职责、不变量与逐字可复制的验收命令。
@@ -33,6 +33,22 @@ final_digest 固定 953775FAEB2FDDE97289491AA260BD8D390C571E48A7A13AD2CB6FB7124F
4. **地图 512×384 大世界**:`ProceduralMap.generate` 同 seed 两次生成逐字节一致;
村核矩形(24..38 × 16..34)由生成器不变式保证可通行。
+## 动画语义(P13,全部为 `tick → 帧` 纯函数)
+
+- 角色图集 `Assets/jiangnan-characters.png`:3840×48,每个 (变体,方向) 占 **6** 格
+ (4 走路 + 2 待机呼吸),格宽 32 高 48。
+ - `cellIndex = (variantIndex * 4 + directionIndex) * 6 + frameIndex`;
+ 方向序 North/South/West/East = 0/1/2/3,变体序 Indigo/Ochre/Jade/Grey/StrawHat = 0..4。
+ - frameIndex:Walk 0..3 = 0..3,IdleOne/IdleTwo = 4/5。
+ - `animationFrame = (tick / 4) % 4`(16 tick 一循环);`idleFrame = (tick / 24) % 2`(48 tick 一循环)。
+ - `characterFrame isMoving tick`:移动取走路帧,静止取呼吸帧。Avatar 用 `Game.fs` 的
+ `avatarMoving`(比较前后位置);NPC 用 `npcSpriteSpecAtTarget`(目标向量 ≥0.5px 视为移动)。
+- 世界图集 `Assets/jiangnan-world.png`:800×32,25 格。水面 3 帧在 slot 1/13/21,
+ 炊烟 3 帧在 slot 22/23/24。
+ - `waterFrameTick = (tick / 32) % 3` → Water / WaterSpriteB / WaterSpriteC;
+ - `smokeFrameTick = (tick / 40) % 3` → SmokeSpriteA/B/C,画在民居屋顶上方 `offsetTile pos -2 -3`。
+- 以上帧选择只用 `tick` 与「是否移动」,无墙钟/`System.Random`;同 tick 必得同帧。
+
## 性能基线命令
```bash
@@ -65,12 +81,30 @@ pkill -f "Xvfb :99"; Xvfb :99 -screen 0 1280x720x24 & sleep 2
ffmpeg -y -f x11grab -video_size 1280x720 -framerate 10 -i :99 -pix_fmt yuv420p out.mp4
LV_AUTOPLAY_SAMPLE=1 LV_AUTOPLAY_DAYLIGHT=1 LV_AUTOPLAY_RECORD=1 \
dotnet src/LivingVillage.Desktop/bin/Release/net8.0/LivingVillage.Desktop.dll
+
+# P13 动画证据(确定性接触表 + 真实运行帧)
+python3 scripts/make-animation-evidence.py # -> evidence/walk-idle-frames.png 等
+# 真实运行帧(白天 / 夜晚各一次;record 目录与间隔可用环境变量覆盖)
+timeout 45 xvfb-run -a -s "-screen 0 1280x720x24" env \
+ LV_AUTOPLAY_SAMPLE=1 LV_AUTOPLAY_DAYLIGHT=1 LV_AUTOPLAY_RECORD=1 \
+ LV_RECORD_DIR="$PWD/evidence/day-run" LV_RECORD_EVERY=2 \
+ dotnet src/LivingVillage.Desktop/bin/Release/net8.0/LivingVillage.Desktop.dll
+timeout 45 xvfb-run -a -s "-screen 0 1280x720x24" env \
+ LV_AUTOPLAY_SAMPLE=1 LV_AUTOPLAY_RECORD=1 \
+ LV_RECORD_DIR="$PWD/evidence/night-run" LV_RECORD_EVERY=2 \
+ dotnet src/LivingVillage.Desktop/bin/Release/net8.0/LivingVillage.Desktop.dll
```
+- `LV_RECORD_DIR` 默认 `/tmp/lv-p5-prompt`,`LV_RECORD_EVERY` 默认 25(每 N 次绘制存一帧)。
+ 跑完 `sample result=ok`;连续移动帧(如 day-run 的 0136..0146)即走路逐帧采样。
+
## 取证快照位置(近期)
- `/tmp/lv-p2-ui/`、`/tmp/lv-p3-fixes/`(标题/键位/P5 提示与修)
- `/tmp/lv-p6-art/`(昼夜光照/四帧行走/标题入场)
- `/tmp/lv-p7-map/`(512×384 大世界巡游帧 + 夜灯对照)
- `/tmp/lv-p8-cc0/`(CC0 同 seed 对照帧)
+- `/tmp/opencode/lv-p13/evidence/`(P13:`walk-idle-frames.png`、`water-3phase.png`、
+ `smoke-3phase.png`、`water-2frame.png`、`smoke-2frame.png`、`day-panorama.png`、
+ `night-lantern.png`、`day-night-compare.png`、`walk-real-run.png`、`day-run/`、`night-run/`)
- `artifacts/perf-independent/<TS>/`(digest 3 联测回读)