通行証 · HALL PASS DOCS · PLAY

iPhone 16 performance testing

Target device: standard iPhone 16. Record the exact iOS version in each report. This is a physical-device procedure; browser viewport emulation and the iOS Simulator do not establish phone frame rates.

Safari: available on the live build

  1. Before starting a run, open https://hallpass.cc/?devtools=1&perf=1 on the phone. Enter iPhone 16 / iOS … / Safari / cold in the notes, then Start recording. ?perf=1 still opens the recorder directly; adding devtools=1 keeps Options → Developer → Performance Test available during a pause.
  2. Play normally. Choose the character, team, map and tier that showed the slowdown. Leave Glow FX on. The recorder observes the real run and does not change enemies, pickups, rewards, saves or simulation timing.
  3. Through the last crowded part of the Final, keep playing for at least a minute. Pause → Options → Developer → Performance Test → Stop recording.
  4. Share / save report exports JSON to Files or the iOS share sheet where supported. Copy report is the fallback. Export before closing/reloading the app: reports are held in memory, not persisted or automatically sent.

The recorder stores at most 72,000 gameplay frames (about 20 minutes at 60 fps), then stops and prompts you to export. It excludes menus, pauses, hidden tabs, level picks and boundary frames. Long stalls during visible gameplay remain. No recording overhead or view wrappers are active until Start is pressed.

Developer tools are hidden during ordinary play. Ctrl+Shift+D toggles them at the title, in Options or while paused, provided no text field or sheet is active. The flag lasts only for the app session; it is not saved to the Club Card. Touch browsers use ?devtools=1. Do not reload a running game to add URL flags. Force Refresh is available only in Developer from title Options.

Install directly from Xcode; TestFlight can follow

On the Mac, use Node 22+ and Xcode 26+ for this Capacitor 8 project (Capacitor requirements). From the checked-out repository:

git pull --ff-only
npm ci
npm run ios:prepare
npm run ios:open

ios:prepare creates the production web build, packages the assets actually referenced by the game into dist-app/, and synchronizes the iOS project. This fixes the old native allowlist which omitted heads, HD FX, sprites, portraits, menu CSS/fonts and other current game art. Public libraries and showroom experiments are excluded. The installed game must match the web build ID shown in developer-enabled Options → Developer; web deployments alone do not update installed apps.

In Xcode:

  1. Connect the iPhone by USB, unlock it and accept Trust. Select the App target → Signing & Capabilities → your Team, with automatic signing. The repository has no developer Team selected. Bundle ID is com.verybad.hallpass.
  2. Enable Developer Mode on the phone when prompted. This is required for development installs, not TestFlight (Apple instructions).
  3. Select the physical iPhone as the run destination and press Run. Resolve any signing/package/compiler errors before interpreting performance.
  4. For representative measurements, Edit Scheme → Run → Release build configuration; disable Debug executable. Install, then launch from the phone's home screen with Xcode's debugger and Safari Inspector detached.
  5. At the title, use Ctrl+Shift+D on an external keyboard to enable the session's developer tools; the installed app has no browser address bar. Open Options → Developer → Performance Test, record the same workload and label it iPhone 16 / iOS … / Xcode Release / cold.

No Mac or attached phone is available to the Windows agent. Web build, asset packaging and Capacitor synchronization can be checked here; native compilation, signing and physical-device FPS require the Mac/phone. The ad-tracker Swift plugin has not yet been verified by a Mac compile. Keep the first full compiler error if Xcode stops; do not silently drop a plugin to get a performance result.

Compare fairly

Use the same build, character/team, loadout, room, tier, zoom, FX settings, orientation and brightness. Keep Low Power Mode off for the primary comparison; record charging state and any thermal warnings in the label. Safari and the native app keep separate local saves, so verify loadouts instead of assuming they transferred. Do not use ?stress or ?bot on a real save for this test.

Collect three passes in each runtime: one after the phone cools down, then two after sustained play. Include the crowded last minute and domain/death bursts. Repeat a comparable room when exact enemy counts differ. Check the per-window peak enemies, pickups, projectiles and active sprites before comparing numbers.

Reports include build, user agent, viewport/DPR, runtime, seed/map/character, simulation time, effective resolution range, bloom state, average FPS, frame-time p50/p95/p99/max and counts above 33.3/50 ms. Each window covers up to 60 measured frames. CPU timings cover the game frame, scene synchronization and render submission; render submission is not GPU execution time. Instrumentation has some overhead. A 60 fps goal means roughly 16.7 ms/frame; inspect the tail and warm runs, not just an average. No real-iPhone performance claim has been made yet.

Diagnose a slow sample

On iPhone enable Safari → Advanced → Web Inspector (Safari may be under Apps in Settings). On Mac Safari, Settings → Advanced → Show features for web developers. Connect the phone and choose its Hall Pass page from the Develop menu (WebKit instructions). Use Timelines to inspect a short crowded interval, with screenshots disabled unless needed. Capture a second recording with the Inspector detached for FPS.

For the installed app, a Debug build is inspectable by Capacitor's default. Release builds are not enabled for Web Inspector in the committed config. For a local diagnostic Release build only, set ios.webContentsDebuggingEnabled: true in capacitor.config.json, sync and reinstall; remove it before distribution. The in-game recorder works in either build without that flag.

If game CPU grows with counts, inspect simulation, HUD and scene sync first. If frame time grows while CPU submission stays small, investigate GPU/overdraw, resolution and thermal limits; that pattern is evidence to investigate, not a GPU measurement. Xcode Instruments on the physical phone can check CPU, memory and thermal behavior. TestFlight setup is in IOS-TESTFLIGHT.md.

HALL PASS by Very Bad Games · Solo Developer Chris Sands · All documentation