summaryrefslogtreecommitdiff
path: root/scripts/bench-p70.sh
diff options
context:
space:
mode:
authorSomhairle H. Marisol <[email protected]>2026-09-29 09:42:17 +0800
committerSomhairle H. Marisol <[email protected]>2026-09-29 09:42:17 +0800
commitf01aa1a9a8d19db5ab908ddbb30b0467be8aa092 (patch)
tree2385fd0b75b3b35f5a29ac9b5c02d9b9e5aea13b /scripts/bench-p70.sh
parent54732d906a68d89ee1446ddb82ae639a016925be (diff)
downloadliving-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-xscripts/bench-p70.sh82
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"