---
title: "Renderer performance"
description: "Measured pan, zoom, focus and selection frame cost at 13,784 and 53,018 seats, the method behind the numbers, what is withheld, and how to reproduce it."
---

Large charts are the question everyone asks before committing to a seating
layer, so the answer here is a measured run rather than a claim: the numbers,
the machine they came from, the spec that produced them, and the parts we are
not publishing.

**At 53,018 seats the buyer renderer measured 17.6 ms p95 frames while panning,
zooming and selecting in this desktop run. The venue is on screen in 348 ms and
every seat is drawn within 4.3 s while it stays interactive; the flat-to-3D
transition measured a 34.2 ms p95 frame.**

Open the chart and test it yourself, no signup:
[the 53,018-seat public demo](https://app.seatlayer.io/demo/play/large-stadium).

## Method

The run compares two published charts on the same machine in the same session,
so the second column is a scale comparison rather than a lone number.

| | |
| --- | --- |
| Measured | 27 August 2026, commit `84380e3b` (fixture waits for the progressive reveal to finish before probing) |
| Machine | Apple Silicon laptop, Chromium via Playwright, 1280x800, foregrounded window, load average ~4 |
| Fixture | `e2e/fixtures/renderer-13k-benchmark.html?venue=mega` (53,018 seats) against `?venue=uber` (13,784 seats) |
| Spec | `e2e/renderer-50k-benchmark.spec.ts` |

Two details in that row do the real work. The window is foregrounded, because a
hidden tab freezes `requestAnimationFrame` and a background run measures a
renderer that is not drawing. And the fixture waits for every seat to land
before it probes — probing mid-reveal measures the reveal, not the renderer.

## Numbers

The chart is progressive, so readiness has two milestones: the venue is usable
when its sections are on screen, and every individual seat lands after that
without the map going unresponsive in between.

| Measurement | 13,784 seats | 53,018 seats |
| --- | --- | --- |
| Venue on screen | 182 ms | 348 ms |
| Every seat drawn | 1,630 ms | 4,260 ms |
| JS heap | 53.5 MB | 121.9 MB |

Interaction is reported as the 95th-percentile frame duration and the frame
rate recorded by the probe. The FPS value is a separate observation, not a
mathematical conversion of the p95 duration. p95 exposes the slower end of the
recorded frames that a mean can hide.

| Interaction | 13,784 seats | 53,018 seats |
| --- | --- | --- |
| Flat-to-3D transition | 17.7 ms · 58 FPS | 34.2 ms · 49 FPS |
| Focus a section | 17.7 ms · 59 FPS | 17.3 ms · 54 FPS |
| Pan, focused | 17.6 ms · 60 FPS | 17.4 ms · 60 FPS |
| Zoom, focused | 17.6 ms · 55 FPS | 17.6 ms · 46 FPS |
| Selection burst of 32 seats | 17.7 ms · 60 FPS | 17.6 ms · 52 FPS |

The p95 frame is flat across a 3.8x difference in seat count for every
interaction except the flat-to-3D transition, which is the one moment the whole
venue is rebuilt in a new projection. What scales is the one-off cost — time to
draw every seat, and resident memory — not the cost of a frame once the chart
is up.

## What this run does not publish

Camera-glide numbers measured while the progressive seat reveal was still
running are not published; the fixture now waits for every seat before probing
(an earlier same-day run mid-reveal showed 150-349 ms frames, which measured the
reveal, not the renderer).

The viewport-culling probe reports 0 culled section groups at the 53,018-seat
focus endpoint on this build and on the previous day's build alike; the fitted
camera for a stadium-sized section stays below the live-seat threshold, so the
venue paints from the cached overview bitmap there. Frame timings above are
unaffected; the probe needs a zoomed-in endpoint to count culled groups.

No maximum seat count is published either. 53,018 is the largest chart measured,
not a ceiling, and these figures describe the buyer renderer rather than an
end-to-end authoring session. The machine and build are stated above precisely
because a number without them is not reproducible; validate an unusually large
or unusual venue against your own chart.

## How to reproduce

```bash
pnpm exec playwright test e2e/renderer-50k-benchmark.spec.ts
```

The spec drives both fixtures, waits for the reveal to settle, records short
probes for each interaction, and prints the same tables. Run it foregrounded on
a quiet machine; a laptop under load, a hidden window, or a probe that starts
before the reveal finishes will not reproduce these numbers.