summaryrefslogtreecommitdiff
path: root/scripts/bench-p70.sh
diff options
context:
space:
mode:
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"