#!/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"