From f01aa1a9a8d19db5ab908ddbb30b0467be8aa092 Mon Sep 17 00:00:00 2001 From: "Somhairle H. Marisol" Date: Tue, 29 Sep 2026 09:42:17 +0800 Subject: p70: 启动帧率与渲染基准(真实可复跑数据) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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/渲染口径/字形表未动 --- scripts/bench-p70.sh | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100755 scripts/bench-p70.sh (limited to 'scripts/bench-p70.sh') 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" -- cgit v1.2.3