Skip to content

game: Pokémon Pokopia builds an IPA and plays on an iPhone 17 Pro - #2514

Open
SpookOrSpooky wants to merge 1 commit into
seedds:mainfrom
SpookOrSpooky:games/pokopia-iphone
Open

SpookOrSpooky wants to merge 1 commit into
seedds:mainfrom
SpookOrSpooky:games/pokopia-iphone

Conversation

@SpookOrSpooky

Copy link
Copy Markdown

Pokémon Pokopia (0400A3A01EE4C000) now builds an IPA, and its note records the first iPhone runs, including a 30 fps cap that plays without the 60 fps stalls and audio dropouts.

Profile fix

build_ipa.sh copies each profile's pso_manifest.tsv into the app with its shader tables. It stopped at copy shader tables for Pokopia, whose profile had none; Kirby Air Riders (040077201BE50000) has none either. The profile now has the header-only list that other profiles keep until one is recorded (DM_PSO_RECORD). With it, a start logs 0 lines instead of a red line for a missing list.

iPhone results, in the game note

All runs were on an iPhone 17 Pro (iPhone18,1, iOS 27.2.1), with Xcode 27.2 and a free Personal Team with Increased Memory Limit. The app was prepared with --prepare-xcode on ccd834e0 (shader chain d24f05cf9d78), with all 131,426 iOS shaders, and installed from Xcode.

Session Result
60 fps, defaults, 19 min No crash. Pipelines built on the submit thread stalled the game 56 times for 100 ms or more, up to 7.5 s, with audio and input waiting through them. Thermal state 2 after about 5 minutes
Metal 4 pipelines No frame of 2 s or more. But the first-start prebuild took 12 min 13 s and heated the phone before play, no CPU time ran on performance cores, audio starved, and iOS reset Bluetooth under memory pressure
30 fps (DM_PRESENT_INTERVAL=display, DM_FPS_TARGET=30 in Documents/env.txt), Metal 4 off, about 1.5 min Held 30 fps at thermal state 0, with 67 to 78% of CPU time on performance cores and no audio underrun

On the Mac, the same two switches keep the game's speed, because it steps by elapsed time: a timed stick hold covered at least as much ground at 30 fps as at 60. CPU energy fell from 2.4 W to 0.97 W. The note's Open list asks whether the profile should offer 30 fps as a Frame rate setting; the profile has no frame step, so that would be present_interval display with a 30 fps target. A longer iPhone run at 30 fps would settle it.

Checks

  • test_docs, test_game_profile, test_launcher_settings, test_settings, test_pso_offline, test_nsp_incremental, test_nsp_mac_app and test_profile_guess pass.
  • Not run: regress.py, since the change is one profile file and a note, and a shader build, since the profile's shader inputs are unchanged.

🤖 Generated with Claude Code

build_ipa.sh copies each profile's pso_manifest.tsv into the app with its shader tables, and stopped at `copy shader tables` for Pokopia, whose profile had none (Kirby Air Riders has none either). The profile now carries the header-only list other profiles keep until one is recorded (DM_PSO_RECORD); a start then logs `0 lines` instead of a red line for a missing list.

The note records the first iPhone runs: an iPhone 17 Pro (iOS 27.2.1, Xcode 27.2, a free Personal Team with Increased Memory Limit), the app prepared with --prepare-xcode on ccd834e (shader chain d24f05cf9d78) and installed from Xcode. A 19-minute playtest at 60 fps had no crash, with seconds-long stalls from pipelines built on the submit thread. A Metal 4 session had none of those, but a 12-minute first-start prebuild, starved audio on a hot phone with no CPU time on performance cores, and a Bluetooth reset under memory pressure. A short session at 30 fps (DM_PRESENT_INTERVAL=display and DM_FPS_TARGET=30 in Documents/env.txt, Metal 4 off) held its rate at thermal state 0 with no audio underrun. On the Mac the cap keeps the game's speed (it steps by elapsed time) and cut the CPU energy from 2.4 W to 0.97 W. The note's Open list keeps whether the profile should offer 30 fps as a Frame rate setting.

Checked: test_docs, test_game_profile, test_launcher_settings, test_settings, test_pso_offline, test_nsp_incremental, test_nsp_mac_app and test_profile_guess. Not run: regress.py (one profile file and a note) and a shader build (the profile's shader inputs are unchanged).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added docs Documentation game: 0400A3A01EE4C000 Pokémon Pokopia labels Nov 12, 2026
@SpookOrSpooky

Copy link
Copy Markdown
Author

Hey folks. Above is the AI summary of the PR here, which bridges from the earlier ZORCT optimizations from the 10th of Nov. As mentioned, pso_manifest was missing (and req.) to build for iPhone -- which should also be useful for Kirby Air Riders given the engine similarity.

Testing concluded that while 60fps is playable, on both Metal and non-Metal runs, audio frames significantly suffer in both situations, and bluetooth when Metal is active (measured on a 17 Pro). Thermal throttling is evident in both situations, with pipeline pre-load for Metal kicking off severe throttling prior to game launch. This is without any case present, on a bare iPhone.

30 fps was the trick. Frame counting to animation conclusions matched that 30fps was the saving grace for the thermal, sound, and CPU/GPU constraints on device.

Lastly, cloud saving was confirmed to be without issue. Graceful handoff between Mac and iOS runs was tested.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Documentation game: 0400A3A01EE4C000 Pokémon Pokopia

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants