acdream/tools/vm0/perf-run.sh
Erik 30e72a2af8 research(vm0): Campaign AR's pack-off path IS the pre-campaign renderer - PASS
Exact-pixel and production-perf comparison of 6c79d35c (+ only the A2
normal files, so no terrain mask is needed) against c51b07ef with no pack:
connected as +Acdream, visible window, one isolated config clone per
variant, pinned clocks. Open field: the only differences are idle pose,
mana digits and a passing flyer. Holtburg: same-binary-twice defines the
dynamic mask (9.8%); in the static 90% both self-diffs have ZERO pixels
with |d|>=8 while base+normals vs HEAD-off has 841/729 - all streaks inside
the animated lifestone. Buildings, ground, trees, sky and UI are clean.

Perf (uncapped Release, no automation observer, ACDREAM_FRAME_PROF=1):
Holtburg CPU p50 4.7 -> 4.1 ms, Arwic 6.0 -> 5.2 ms, GPU unchanged,
alloc/frame 574 KB -> 21 KB. No regression; F5b's '27.8 ms retail CPU' was
the observer.

Three false alarms recorded so nobody repeats them: the isolated gate
settings lack fieldOfView (90 vs the real 86.33 -> a 0.952 zoom); the real
%APPDATA% settings still selected acdream.atmospheric/low (pack ON); a
minimized GLFW window is throttled and never settles.

Tools: tools/vm0/capture-visible.ps1 (pre-campaign gate + -Exe/-Live/
-ConfigDir/-CharacterName/-PreCaptureCommand), tools/vm0/perf-run.sh,
and -BuildingDetailTextures on run-offline-pixel-gate.ps1. Baseline
patches under docs/research/evidence/vm0/.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-22 21:40:40 +02:00

21 lines
1.7 KiB
Bash

#!/usr/bin/env bash
# Campaign VM slice VM0 production perf probe: connected, uncapped Release, NO automation
# artifact dir (so no render-scene observer), reads the client's own [frame-prof] lines.
# usage: perf-run.sh <name> <exe> <configdir> <outdir> [slash-command]
set -u
name=$1; exe=$2; cfg=$3; out=$4; cmd=${5:-}
mkdir -p "$out/$name"; log="$out/$name/client.log"; probe="$out/$name/probe.txt"
sc="$out/$name/session.json"
cat > "$sc" <<JSON
{"version":1,"sessions":[{"id":"vm0-perf","endpoint":{"host":"$ACDREAM_TEST_HOST","port":$ACDREAM_TEST_PORT},"account":"$ACDREAM_TEST_USER","character":{"name":"+Acdream"},"credential":{"provider":"Environment","reference":"ACDREAM_TEST_PASS"}}]}
JSON
{ echo "wait world-ready 90000"; echo "wait world-visible 30000"; [ -n "$cmd" ] && { echo "command $cmd"; echo "wait materialized 1 60000"; }; echo "sleep 75000"; } > "$probe"
ACDREAM_DAT_DIR="$USERPROFILE/Documents/Asheron's Call" ACDREAM_CONFIG_DIR="$cfg" ACDREAM_DATA_DIR="$out/$name/data" ACDREAM_CACHE_DIR="$out/$name/cache" \
ACDREAM_NO_AUDIO=1 ACDREAM_DAY_GROUP=0 ACDREAM_WORLD_TIME=0.5 ACDREAM_SKY_PHASE_SECONDS=0 ACDREAM_MSAA_SAMPLES=0 ACDREAM_UNCAPPED_RENDER=1 ACDREAM_FRAME_PROF=1 \
ACDREAM_UI_PROBE_SCRIPT="$probe" "$exe" --session-config "$sc" > "$log" 2>&1 &
pid=$!
# wait for the probe to finish (75 s after arrival), then graceful close
for i in $(seq 1 200); do grep -q "UI probe script complete" "$log" 2>/dev/null && break; sleep 1; done
pwsh -NoProfile -Command '$p=Get-Process -Name AcDream.App -ErrorAction SilentlyContinue; if($p){$p.CloseMainWindow()|Out-Null; if(-not $p.WaitForExit(10000)){$p|Stop-Process -Force}}' >/dev/null
wait $pid 2>/dev/null
echo "== $name"; tr -d '\r' < "$log" | grep "frame-prof" | tail -8 | sed 's/^.*\[frame-prof\]/ /' | cut -c1-150