Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
5879de2
Cull distant dropped item labels
Arbousier1 Jul 12, 2026
b81b6a1
Rate limit dropped label visibility
Arbousier1 Jul 12, 2026
3004f87
Add Paper A-B performance benchmark
Arbousier1 Jul 12, 2026
5994537
Run performance benchmark for relevant PR changes
Arbousier1 Jul 12, 2026
bacf810
Fix benchmark fixture compilation
Arbousier1 Jul 12, 2026
9966c66
Skip unused cramping index
Arbousier1 Jul 12, 2026
0b6eb44
Add live performance measurement harness
Arbousier1 Jul 12, 2026
a77f5d4
Fix live performance harness compilation
Arbousier1 Jul 12, 2026
d3dd6f9
Add static item anchor A-B mode
Arbousier1 Jul 12, 2026
c798295
Add phase-two rendering experiments
Arbousier1 Jul 12, 2026
bec189d
Add phase-two performance validation
Arbousier1 Jul 12, 2026
f62a0b0
Optimize phase-two hot paths and validation
Arbousier1 Jul 13, 2026
25ed706
Benchmark hybrid dropped item viewer culling
Arbousier1 Jul 13, 2026
505de31
Use primitive viewer scans for dropped item culling
Arbousier1 Jul 13, 2026
c155c2e
Harden dropped item visibility benchmarks
Arbousier1 Jul 13, 2026
63ff53f
Capture robust visibility benchmark samples
Arbousier1 Jul 13, 2026
7a0b13f
Interleave dropped item viewer coordinates
Arbousier1 Jul 13, 2026
0803168
Adapt viewer storage to measured workloads
Arbousier1 Jul 13, 2026
9dd03d4
Keep viewer scan hot paths inlineable
Arbousier1 Jul 13, 2026
eb07a29
Specialize viewer storage hot loops
Arbousier1 Jul 13, 2026
62287ac
Benchmark primitive culling against production grid
Arbousier1 Jul 13, 2026
1eae5ba
Harden production visibility A-B methodology
Arbousier1 Jul 13, 2026
b01b941
Reject viewer queries outside world bounds
Arbousier1 Jul 13, 2026
e17156c
Adapt dropped item visibility indexing
Arbousier1 Jul 13, 2026
b5eb7b8
Harden adaptive viewer indexing
Arbousier1 Jul 13, 2026
4ed0faa
Inline dropped item viewer hot paths
Arbousier1 Jul 13, 2026
d32db12
Flatten dropped item viewer scans
Arbousier1 Jul 13, 2026
7dd393f
Keep primitive viewer backoff on the hot path
Arbousier1 Jul 13, 2026
244e197
Harden adaptive viewer state tests
Arbousier1 Jul 13, 2026
361e0f3
Let the viewer cost model handle deep scans
Arbousier1 Jul 13, 2026
beb45f1
Benchmark production visibility ranges
Arbousier1 Jul 13, 2026
3483205
Add offline packet capture analysis
Arbousier1 Jul 13, 2026
9782c51
Validate packet analyzer in CI
Arbousier1 Jul 13, 2026
6c37b29
Keep range probes outside the visibility sphere
Arbousier1 Jul 13, 2026
8c1f24c
Reduce visibility allocations and block update gaps
Arbousier1 Jul 13, 2026
628e852
Add isolated Phase 2 runtime evidence
Arbousier1 Jul 13, 2026
72d3fe4
Run Phase 2 smoke gates on pull requests
Arbousier1 Jul 13, 2026
9b69d9b
Record runtime dependency inventory without dev checks
Arbousier1 Jul 13, 2026
2ee83dc
Break the client-loaded chunk wait cycle
Arbousier1 Jul 13, 2026
f63b215
Use Paper 26 game rule identifiers
Arbousier1 Jul 13, 2026
875207c
Fix cross-platform Phase 2 analyzers
Arbousier1 Jul 13, 2026
67a1104
Add event-driven block benchmark evidence
Arbousier1 Jul 13, 2026
0080735
Gate display visibility on sent chunks
Arbousier1 Jul 13, 2026
342627a
Ignore per-tick furnace burn noise
Arbousier1 Jul 13, 2026
9eab8a7
Smooth synchronized furnace updates
Arbousier1 Jul 13, 2026
3e23f2e
Attribute direct-write tick spikes
Arbousier1 Jul 13, 2026
74d17f4
Split direct-write mutation phases
Arbousier1 Jul 13, 2026
495253a
Capture direct-write Spark profiles
Arbousier1 Jul 13, 2026
ff97c99
Profile steady-state block workloads
Arbousier1 Jul 13, 2026
da028a5
Separate profiled runtime evidence
Arbousier1 Jul 13, 2026
92d42aa
Skip unchanged furnace progress renders
Arbousier1 Jul 13, 2026
0f2ddcb
Cache unchanged legacy display text
Arbousier1 Jul 13, 2026
af714a5
Isolate entity text state tests
Arbousier1 Jul 13, 2026
b93d990
Handle legacy performance manifests
Arbousier1 Jul 13, 2026
e25627e
Gate dropped label visibility optimizations
Arbousier1 Jul 14, 2026
f723b9e
Fix animation and tile lifecycle regressions
Arbousier1 Jul 14, 2026
79ae1b0
Unify workstation item display lifecycle
Arbousier1 Jul 14, 2026
b11b85f
Fix lectern and note block text displays
Arbousier1 Jul 14, 2026
b3c2453
Restore visual parity with packet-only displays
Arbousier1 Jul 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 91 additions & 0 deletions .github/workflows/benchmark.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
name: A-B Performance Benchmark

on:
workflow_dispatch:
pull_request:
paths:
- '.github/workflows/benchmark.yml'
- 'benchmark/**'
- 'build.gradle.kts'
- 'common/src/main/java/com/loohp/interactionvisualizer/entities/DroppedItemDisplay.java'
- 'common/src/main/java/com/loohp/interactionvisualizer/entities/DroppedItemSpatialIndex.java'
- 'common/src/main/java/com/loohp/interactionvisualizer/entities/VisibilityTokenBucket.java'

permissions:
contents: read

jobs:
benchmark:
name: Paper 26.1.2 A-B benchmark
runs-on: ubuntu-latest
timeout-minutes: 20

steps:
- name: Check out repository
uses: actions/checkout@v4

- name: Set up Java 25
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "25"

- name: Set up Gradle
uses: gradle/actions/setup-gradle@v4

- name: Build disposable benchmark plugin
run: ./gradlew benchmarkJar --no-daemon --no-build-cache --rerun-tasks

- name: Download stable Paper 26.1.2
env:
PAPER_USER_AGENT: InteractionVisualizer-Benchmark/1.0 (https://github.com/EllanServer/InteractionVisualizer)
run: |
mkdir -p benchmark-server/plugins
BUILDS=$(curl --fail --silent --show-error \
-H "User-Agent: $PAPER_USER_AGENT" \
https://fill.papermc.io/v3/projects/paper/versions/26.1.2/builds)
PAPER_URL=$(echo "$BUILDS" | jq -r 'first(.[] | select(.channel == "STABLE") | .downloads."server:default".url) // empty')
test -n "$PAPER_URL"
curl --fail --location --show-error \
-H "User-Agent: $PAPER_USER_AGENT" \
--output benchmark-server/server.jar "$PAPER_URL"
cp build/libs/InteractionVisualizer-*-benchmark.jar benchmark-server/plugins/

- name: Configure isolated benchmark server
working-directory: benchmark-server
run: |
echo 'eula=true' > eula.txt
cat > server.properties <<'EOF'
online-mode=false
level-name=benchmark-world
level-type=minecraft:flat
generate-structures=false
spawn-protection=0
view-distance=3
simulation-distance=3
max-players=1
max-tick-time=-1
sync-chunk-writes=false
EOF

- name: Run alternating A-B measurements
working-directory: benchmark-server
run: |
java -Xms2G -Xmx2G -XX:+UseG1GC -jar server.jar --nogui | tee benchmark-server.log
test -f plugins/InteractionVisualizerBenchmark/benchmark-results.jsonl
test -f plugins/InteractionVisualizerBenchmark/benchmark-complete.txt
EXPECTED_RESULTS=$(cat plugins/InteractionVisualizerBenchmark/benchmark-complete.txt)
ACTUAL_RESULTS=$(wc -l < plugins/InteractionVisualizerBenchmark/benchmark-results.jsonl)
test "$ACTUAL_RESULTS" -eq "$EXPECTED_RESULTS"

- name: Publish benchmark results
if: always()
uses: actions/upload-artifact@v4
with:
name: interactionvisualizer-ab-${{ github.sha }}
path: |
benchmark-server/plugins/InteractionVisualizerBenchmark/benchmark-results.jsonl
benchmark-server/plugins/InteractionVisualizerBenchmark/benchmark-complete.txt
benchmark-server/benchmark-server.log
if-no-files-found: warn
retention-days: 30
53 changes: 53 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,59 @@ jobs:
- name: Set up Gradle
uses: gradle/actions/setup-gradle@v4

- name: Validate performance tooling
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
$scripts = @(
'tools/perf/phase2-pktmon.ps1',
'tools/perf/analyze-presentmon.ps1',
'tools/perf/analyze-minecraft-debug-profile.ps1',
'tools/perf/analyze-jfr-socket-writes.ps1',
'tools/perf/analyze-phase2-abba.ps1',
'tools/perf/analyze-phase2-pcap.ps1'
)
foreach ($script in $scripts) {
[void][scriptblock]::Create((Get-Content -Raw -LiteralPath $script))
}
$pktmonSelfTestJson = & ./tools/perf/phase2-pktmon.ps1 selftest | Out-String
$pktmonSelfTest = $pktmonSelfTestJson | ConvertFrom-Json
if (-not $pktmonSelfTest.passed) {
throw 'PktMon wrapper self-test did not report passed=true.'
}
$selfTestJson = & ./tools/perf/analyze-presentmon.ps1 -SelfTest | Out-String
$selfTest = $selfTestJson | ConvertFrom-Json
if (-not $selfTest.passed) {
throw 'PresentMon analyzer self-test did not report passed=true.'
}
$debugProfileSelfTestJson = & ./tools/perf/analyze-minecraft-debug-profile.ps1 -SelfTest | Out-String
$debugProfileSelfTest = $debugProfileSelfTestJson | ConvertFrom-Json
if (-not $debugProfileSelfTest.passed) {
throw 'Minecraft debug-profile analyzer self-test did not report passed=true.'
}
$jfrSelfTestJson = & ./tools/perf/analyze-jfr-socket-writes.ps1 -SelfTest | Out-String
$jfrSelfTest = $jfrSelfTestJson | ConvertFrom-Json
if (-not $jfrSelfTest.passed) {
throw 'JFR socket-write analyzer self-test did not report passed=true.'
}
$abbaSelfTestJson = & ./tools/perf/analyze-phase2-abba.ps1 -SelfTest | Out-String
$abbaSelfTest = $abbaSelfTestJson | ConvertFrom-Json
if (-not $abbaSelfTest.passed) {
throw 'Phase 2 ABBA analyzer self-test did not report passed=true.'
}
$pcapSelfTestJson = & ./tools/perf/analyze-phase2-pcap.ps1 -SelfTest | Out-String
$pcapSelfTest = $pcapSelfTestJson | ConvertFrom-Json
if (-not $pcapSelfTest.passed) {
throw 'Phase 2 pcap analyzer self-test did not report passed=true.'
}

- name: Validate runtime harness syntax
shell: bash
run: |
bash -n tools/perf/prepare-phase2-protocol-client.sh
bash -n tools/perf/run-phase2-runtime-once.sh
node --check tools/perf/phase2-protocol-client.js

- name: Run checks and build production jar
run: ./gradlew clean check shadowJar --no-daemon --no-build-cache --rerun-tasks

Expand Down
Loading
Loading