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
- Before starting a run, open https://hallpass.cc/?devtools=1&perf=1 on the
phone. Enter
iPhone 16 / iOS … / Safari / coldin the notes, then Start recording.?perf=1still opens the recorder directly; addingdevtools=1keeps Options → Developer → Performance Test available during a pause. - 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.
- Through the last crowded part of the Final, keep playing for at least a minute. Pause → Options → Developer → Performance Test → Stop recording.
- 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:
- 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. - Enable Developer Mode on the phone when prompted. This is required for development installs, not TestFlight (Apple instructions).
- Select the physical iPhone as the run destination and press Run. Resolve any signing/package/compiler errors before interpreting performance.
- 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.
- 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.