blob: f035bb2f08d7973d3fb9b228292f141c82f348b3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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"
|