Everything the next agent needs to run the Phase 2 optimisation loop on a machine that can launch the client: - analysis/client-perf/: LEVERS (ranked levers + corrections), BENCH-MATRIX (world, scenes, config IDs, blocks B0-B14 with decision rules), PLAYER-TUNING, SPAWN-TUNING, research briefs, the jar scanner and its output, observed default configs, and proposed-configs/ (build.py generates tiers and bench variants and fails on unknown keys; apply_variant.py applies a variant and merges options.txt). - analysis/client-perf/bench/onion-bench/: bench-world datapack (scene teleports, Create grid, mob pen, sound storm, 120 s teleport tour). - analysis/audit/: the static recipe/dependency audit, including gen_fixes.py, which generates the shipped Paxi datapack and was never tracked. - phase0/: per-machine measurement harness (Steam Deck, 7700K/1060, 6700K/1080 Ti). - .pi/journal.md: running work log; read it first. All of it is packwizignored, so nothing here ships to players.
11 KiB
Phase 0 — P1: i7-7700K / GTX 1060 6 GB (Windows)
Setup and measurement procedure for the VRAM-bound machine in the Onion MC client tuning fleet.
Profile
| CPU | Intel i7-7700K, 4 cores / 8 threads, 4.2 GHz base (Kaby Lake) |
| GPU | NVIDIA GTX 1060, 6 GB VRAM (Pascal, GP106) |
| RAM | 32 GB — not a constraint on this machine |
| OS | Windows (the fleet's only Windows box) |
| Binding constraint | VRAM |
| What this tier tests | GPU/VRAM ladder steps with CPU and RAM held non-binding |
| Expected DH answer | On, with quality/distance reduced — VRAM is the wall |
Why this machine matters
- 32 GB of RAM removes RAM/GC as a confound, so this machine isolates pure GPU and VRAM effects. That is where DH's quality preset and CTM/texture fidelity live.
- Its CPU is the same class as P2 (both 4C/8T ~4.2 GHz). Comparing this machine against P2 therefore isolates the GPU/VRAM axis while holding CPU-side mod cost roughly constant. That pairing is the fleet's built-in control — see the taxonomy self-check at the end.
- It is the only Windows machine, so the OS axis is confounded with the GPU axis here. A result that differs from P2 could be the GPU or the driver stack, and this rig cannot separate them. Record it as a known limitation.
Shared measurement protocol
Applies to every machine in the fleet. Duplicated here so this document stands alone.
- Uncapped, vsync off during measurement. Apply the FPS cap only after tuning.
- Metric is p99 frametime and 1% low, not average FPS.
- Discard 10–15 s of warmup per scene — JIT, chunk load, initial GC.
- Settle after any render-distance or DH change.
- Three runs per configuration, report median and spread.
- One variable per run.
- Guardrails: FPS limiter active, power plan changed, or GPU throttling → invalid run.
Step 1 — Windows power and background load
powercfg /list
powercfg /setactive SCHEME_MIN # High performance
- Power plan set to High performance (or Ultimate Performance) and recorded.
- No pending Windows Update or reboot.
- Xbox Game Bar off: Settings → Gaming → Xbox Game Bar → Off.
- Game DVR / background recording off: Settings → Gaming → Captures → Record in the background while I'm playing → Off. This is a real frametime cost.
- Close browsers, Discord, OneDrive, and any streaming/recording software.
- Exclude the instance folder from Windows Defender real-time scanning to remove I/O spikes during chunk loading. Record that you did it.
Step 2 — GPU settings
NVIDIA Control Panel → Manage 3D settings → Program Settings → (Prism's javaw.exe):
- Power management mode → Prefer maximum performance
- Vertical sync → Off
- Low Latency Mode → fixed value, recorded (it changes frame pacing — don't vary it)
- Threaded Optimization → fixed value, recorded (it affects OpenGL apps directly)
- Texture filtering quality → fixed value, recorded
Hardware-Accelerated GPU Scheduling (HAGS): Settings → System → Display → Graphics → Change default graphics settings. Record On/Off and keep it constant. HAGS changes frame pacing and will show up in your p99 numbers.
Fullscreen: run Minecraft in the same display mode every session (fullscreen at
native resolution, or borderless — pick one). Also disable Fullscreen optimizations for
javaw.exe (right-click → Properties → Compatibility) so Windows doesn't add compositor
work. Record the choice.
Step 3 — Confirm GPU state
nvidia-smi ships with the NVIDIA driver on Windows too. Use the identical command as
the Linux machine so both NVIDIA rigs produce the same CSV schema:
& "$env:SystemRoot\System32\nvidia-smi.exe" -q -d PERFORMANCE # check for throttle reasons
New-Item -ItemType Directory -Force ~\mcbench\logs | Out-Null
& "$env:SystemRoot\System32\nvidia-smi.exe" `
--query-gpu=timestamp,memory.used,clocks.sm,clocks.mem,power.draw,temperature.gpu,utilization.gpu `
--format=csv -l 1 > ~\mcbench\logs\gpu-$(Get-Date -f yyyy-MM-dd-HHmmss).csv
- No
SW Power CaporHW Slowdownin the throttle reasons. memory.usedlogging running. On a 6 GB card this is your headline metric — peak VRAM tells you when DH, CTM and texture fidelity have crossed the line.
Step 4 — Measurement tooling: PresentMon
MangoHud does not exist on Windows. Use PresentMon (open source, ETW-based, and it covers OpenGL as well as DX/Vulkan).
Option A — the Frame Time Analysis package (simplest; download from
https://boringboredom.github.io/Frame-Time-Analysis/). It ships a Run.bat:
pushd %~dp0
cd captures
..\presentmon.exe --multi_csv --no_console_stats --hotkey "F10"
Run it as Administrator (ETW capture requires elevation), then press F10 to
start/stop each capture. --multi_csv writes a new CSV per capture cycle into captures/.
Option B — target the Minecraft process explicitly so only MC is captured:
presentmon.exe --process_name javaw.exe --output_file ~\mcbench\logs\pm.csv --timed 30
- Confirm the process name. Prism launches Minecraft as
javaw.exe; verify in Task Manager rather than assuming. - PresentMon emits two CSVs per capture: the raw per-frame data and a stats summary that already contains average / min / max / percentile FPS. Use the summary for a quick read and the raw file for the real analysis.
- Verify a capture produces a CSV with a frametime column before collecting real data.
Step 5 — Analysis: one tool for the whole fleet
Use Frame Time Analysis (https://boringboredom.github.io/Frame-Time-Analysis/). It reads CSV from PresentMon, CapFrameX, OCAT, MangoHud and FrameView, all in the browser, with no upload to a third party.
- Percentiles, lows (1% / 0.1%), box plots, bar charts and summary tables.
- Merge multiple CSV files — this is what lets you put the three runs of one configuration, and the MangoHud CSVs from the Linux machines, side by side on one chart.
- Screenshot export for the record.
This tool is the reason the fleet does not need a custom analyzer: raw capture stays platform-native (MangoHud on Linux, PresentMon on Windows) and analysis is unified.
Step 6 — Launcher and JVM
Use Prism Launcher and launch from a shell so the environment is under your control.
Java: 21 — the same JVM build as the Linux machines (Temurin 21 is a good choice for all three). A different JVM build is a confound.
JVM arguments (identical across the fleet except -Xmx):
-Xmx8G
-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200
-XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC
-XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M
-XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4
-XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90
-XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32
-XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1
32 GB means heap is not a variable here. Keep -Xmx8G fixed and spend your attention on
VRAM.
Step 7 — Pin the in-game settings
Controlled variables — set once, record, do not change between runs unless the run is testing that setting.
- Graphics: Fancy
- Render distance: 8
- Particles: All
- Clouds: Fancy
- Entity shadows: On
- Biome blend: fixed, recorded
- Mipmap levels: 4
- GUI scale: fixed number
- Max framerate: Unlimited
- VSync: Off (also off in the NVIDIA panel — check both)
- FOV, resolution, fullscreen mode: fixed and recorded
Step 8 — Verification run
- PresentMon capture produces a raw CSV and a stats summary CSV.
nvidia-smiVRAM logging is producing a CSV.- MangoHud is not expected here — confirm you are actually capturing through PresentMon.
- Run the same configuration three times and record the spread. Establish this before interpreting anything.
- Confirm peak VRAM is being recorded — it is the whole point of this machine.
Step 9 — Per-session checklist
- Power plan = High performance
- Game Bar and background recording off
- Defender exclusion in place
- NVIDIA power mode = prefer max performance; vsync off; HAGS and Threaded Optimization unchanged since last session
nvidia-smithrottle check clean- VRAM logging started
- PresentMon running as Administrator
- Display mode and resolution unchanged
- No pending Windows Update
Step 10 — Recording sheet
| Field | Example |
|---|---|
| Date / session | 2026-09-28-a |
| Machine | P1-7700K-1060 |
| Config ID | baseline / dh-low / ctm-off / emf-off / … |
| Scene | A-base / B-terrain / C-gui |
| Run # | 1 / 2 / 3 |
| CSV file (raw + summary) | |
| p50 / p95 / p99 frametime (ms) | |
| 1% low FPS | |
| Avg FPS | |
| VRAM peak (MB) | the headline number for this rig |
| Throttle flag | none / SW Power Cap / HW Slowdown |
| Notes |
Machine-specific caveats
- VRAM is the binding constraint, so watch for the cliff, not the slope. On a 6 GB card the failure mode is a sharp p99 regression once DH + CTM + texture fidelity exceed capacity — not a smooth FPS decline. Record peak VRAM alongside every result.
- Two vsync switches exist (in-game and NVIDIA panel). Verify both are off, every session. A single missed vsync makes every configuration look like it hits the target.
- Beware dynamic clocking. Verify no throttle reasons before and after a block of runs.
- This is the only Windows machine, and it is also the weakest GPU — the OS axis is confounded with the GPU axis. A divergence from P2 cannot be attributed to the OS.
- 32 GB makes this the fleet's clean tier for GPU-only effects. If a knob you classified as GPU/VRAM shows a large delta here and almost nothing on P2, the taxonomy is confirmed. If a knob you classified as CPU-render diverges between this machine and P2 in direction, the classification is wrong — both share the same CPU class, so CPU-side effects should track closely.
- Windows measurement is ETW-based (PresentMon) while Linux is MangoHud-based. The two do not measure identically, and the fleet has no same-hardware cross-OS pair, so absolute numbers are not cross-comparable between OSes — only within-OS comparisons are. Derive ladder orderings per OS, then check that the orderings agree.