diff options
| author | Somhairle H. Marisol <[email protected]> | 2026-09-29 09:42:17 +0800 |
|---|---|---|
| committer | Somhairle H. Marisol <[email protected]> | 2026-09-29 09:42:17 +0800 |
| commit | f01aa1a9a8d19db5ab908ddbb30b0467be8aa092 (patch) | |
| tree | 2385fd0b75b3b35f5a29ac9b5c02d9b9e5aea13b /scripts/bench-p70.sh | |
| parent | 54732d906a68d89ee1446ddb82ae639a016925be (diff) | |
| download | living-village-f01aa1a9a8d19db5ab908ddbb30b0467be8aa092.tar.gz | |
p70: 启动帧率与渲染基准(真实可复跑数据)
- scripts/bench-p70.sh:两档基准——Kernel --performance-baseline(6000 tick ×3)
+ Desktop xvfb 60s 真实帧循环;scripts/analyze-p70.py 汇总裁决
- Game.fs:LV_FRAME_LOG=1 逐帧日志(墙钟帧间隔 + GC 线程分配增量 + tick/panel),
仅新增日志,不改渲染/更新逻辑
- P70PerformanceBaselineTests:Pin --performance-baseline final_digest=953775FA…(防漂移)
- 实测:Kernel tps mean=466679 alloc=3032184 gen0/1/2=0/0/0 determinism=PASS;
Desktop 60s frames=8788 fps=139.3 mean=7.179ms max=33.919ms 掉帧>33.3ms=2
每帧分配 mean=231KB p95=297KB;dotnet-counters 缺席已如实标注
- Desktop 338/338、Kernel 120/120;Kernel/Sim/渲染口径/字形表未动
Diffstat (limited to 'scripts/bench-p70.sh')
| -rwxr-xr-x | scripts/bench-p70.sh | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/scripts/bench-p70.sh b/scripts/bench-p70.sh new file mode 100755 index 0000000..f035bb2 --- /dev/null +++ b/scripts/bench-p70.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash +# P70:启动帧率与渲染绘制概要基准(真实可复跑,不宣称未测性能)。 +# +# 两档: +# * Kernel 吞吐:Headless `--performance-baseline`(6000 measure tick ×3,已有入口),落 kernel-baseline.txt。 +# * Desktop 渲染帧:xvfb 真实帧循环 N 秒(默认 60),逐帧打印墙钟帧间隔与线程分配增量 +# (LV_FRAME_LOG=1,仅新增日志、不改渲染逻辑),落 desktop-log.txt。 +# 之后由 scripts/analyze-p70.py 汇总裁决到 docs/evidence/p70-analysis.txt。 +# +# 用法:bash scripts/bench-p70.sh [out-dir] (out-dir 默认 /tmp/opencode/lv-p70) +# 环境:P70_SECONDS(默认 60)基准秒数;P70_FORCE=1 允许 fps=0 时仍返回 0。 +set -u + +REPO="$(cd "$(dirname "$0")/.." && pwd)" +OUT="${1:-/tmp/opencode/lv-p70}" +BENCH_SECONDS="${P70_SECONDS:-60}" +XVFB_ARGS="-screen 0 1280x720x24" + +KERNEL_DLL="$REPO/src/LivingVillage.Headless/bin/Release/net8.0/LivingVillage.Headless.dll" +DESKTOP_DLL="$REPO/src/LivingVillage.Desktop/bin/Release/net8.0/LivingVillage.Desktop.dll" +KERNEL_LOG="$OUT/kernel-baseline.txt" +DESKTOP_LOG="$OUT/desktop-log.txt" + +mkdir -p "$OUT" +echo "[p70] repo=$REPO out=$OUT bench_seconds=$BENCH_SECONDS" +echo "[p70] started_at=$(date -u +%Y-%m-%dT%H:%M:%SZ)" +echo "[p70] kernel_dll=$KERNEL_DLL" +echo "[p70] desktop_dll=$DESKTOP_DLL" + +for dll in "$KERNEL_DLL" "$DESKTOP_DLL"; do + if [ ! -f "$dll" ]; then + echo "[p70] FATAL missing $dll(先 dotnet build LivingVillage.sln -c Release)" >&2 + exit 90 + fi +done + +if command -v dotnet-counters >/dev/null 2>&1; then + COUNTERS=available +else + COUNTERS=missing +fi +if command -v xvfb-run >/dev/null 2>&1; then + XVFB=available +else + XVFB=missing +fi +{ + echo "dotnet-counters=$COUNTERS" + echo "xvfb-run=$XVFB" + echo "bench_seconds=$BENCH_SECONDS" + echo "desktop_dll=$DESKTOP_DLL" + echo "kernel_dll=$KERNEL_DLL" +} > "$OUT/env.txt" +echo "[p70] dotnet-counters=$COUNTERS" +if [ "$XVFB" = "missing" ]; then + echo "[p70] FATAL xvfb-run 不可用(Desktop 需虚拟显示)" >&2 + exit 91 +fi +echo "[p70] xvfb-run=$XVFB(不阻塞:逐帧分配用 GC.GetAllocatedBytesForCurrentThread 实测)" + +echo "[p70] kernel baseline: dotnet $KERNEL_DLL --performance-baseline" +dotnet "$KERNEL_DLL" --performance-baseline > "$KERNEL_LOG" 2>&1 +KCODE=$? +echo "[p70] kernel exit=$KCODE" + +echo "[p70] desktop frame loop: ${BENCH_SECONDS}s @ 1280x720 under xvfb" +timeout $((BENCH_SECONDS + 180)) xvfb-run -a -s "$XVFB_ARGS" env \ + LV_AUTOPLAY_SAMPLE=1 \ + LV_PERF_SOAK_SECONDS="$BENCH_SECONDS" \ + LV_FRAME_LOG=1 \ + LV_UNLOCK_FPS=1 \ + LV_LEGACY_MAP=1 \ + LV_RECORD_DIR="$OUT" \ + dotnet "$DESKTOP_DLL" > "$DESKTOP_LOG" 2>&1 +DCODE=$? +echo "[p70] desktop exit=$DCODE frames=$(grep -c '^p70-frame ' "$DESKTOP_LOG" || true)" +echo "[p70] ended_at=$(date -u +%Y-%m-%dT%H:%M:%SZ)" + +python3 "$REPO/scripts/analyze-p70.py" "$OUT" "$REPO/docs/evidence/p70-analysis.txt" +ACODE=$? +echo "[p70] analyze exit=$ACODE -> $REPO/docs/evidence/p70-analysis.txt" +exit "$ACODE" |
