iOS port - #1767
iOS port#1767Markos-Th09 wants to merge 11 commits into
Conversation
Yes, the only way to play this currently is using either by connecting a controller or keyboard and mouse to your device. |
|
I’m happy to announce the first playable release of this port intended for testing. You can download the IPA from the releases page of my fork. Anyone is welcome to report bugs and issues either here or in the issues page of the fork. You WILL need a controller or mouse/keyboard to play this. |
|
Which one do I download? I'm new here |
You can download |
Have you sideloaded anything before? If you already know how to do that you don’t need a pc. In order not to fill this thread with unrelated things, you can message me on discord (MarkosTh09) for assistance or open a discussion in my fork. |
|
Didn't I say I was new? Okay then lol |
Co-authored-by: Isaac Marovitz <isaacryu@icloud.com>
…mitives Fixes synchronization issues observed only in iOS
Use main.cpp as the sole application entry point via SDL_main.h and remove UnleashedRecompIOSLauncher to avoid duplicated build logic.
|
Tested this branch on real hardware — iPhone 16 Pro (A18 Pro), built with Xcode 27 on an M4 Pro, running the native Metal backend your branch integrates. Sharing everything we hit, in order, with fixes on this branch: https://github.com/yorgunkral31/UnleashedRecomp/tree/ios Result: the game boots to the title screen on device with native Metal, and is stable enough at the menu that the idle attract intro plays. Findings & fixes
Happy to turn any of this into PRs against your branch in whatever shape is useful, and to run more on-device tests — this is a fantastic base. (Credit also to @squidbus for the Metal backend.) |
|
Update — the rendering corruption is root-caused and fixed. Finding 6 turned out to be much bigger than two pipelines: in the cross-compiling (iOS) path, the host XenosRecomp is built without the Fix (injected via After regenerating the shader cache with the define, rendering is fully correct on device — and the two Current state on iPhone 16 Pro (A18 Pro), native Metal: boots reliably, renders correctly, 35–60 FPS at default settings. Genuinely playable. Offer stands to split any of this into PRs in whatever shape works for you. |
|
Final status after extended play sessions on the iPhone 16 Pro (day + night stages, on charger, DualShock 4 over Bluetooth):
With the four fixes on our branch, this is now genuinely playable end to end with the native Metal backend. Happy to help get any of it landed here. |
|
One more: 120 FPS now works on iPhone. Three things are needed together:
Confirmed running above 60 on the iPhone 16 Pro. The plume commit (plus a small null-PSO draw safety guard, yorgunkral31/plume@b828441) probably belongs with the iOS support work in renderbag/plume#102 — feel free to fold both in. |
|
For anyone wanting to try this on device: an up-to-date experimental IPA built from the |
|
@yorgunkral31 I appreciate the effort you have put into continuing as I did not have the time to continue this. How far along the game have you tested specifically? Although I did not post any updates here, it was stable enough to play to the first level. I experienced issues and new types of deadlocks when I reached level 2 before, so until a full playthrough is completed we can't be confident the deadlock issues are resolved. As far as NFDe is concerned I have my own implementation of it for iOS, however I have not published a fork of it because it’s somewhat incomplete and its semantics are not really generally correct due to how the iOS file model works, especially protected resource access, which is incompatible with the current NFDe API. However, it works well enough for this purpose. |
|
Thanks! To be precise about test coverage: so far it's early-game only — the opening day and night stages plus hub/menu navigation on the iPhone 16 Pro (multiple sessions, cold relaunches, DualShock over Bluetooth). Zero deadlocks, hangs or stutters in those sessions — but no full playthrough yet, so your level-2 caution absolutely stands. We'll keep playing further and report anything that surfaces. One clarification that may explain the difference vs your experience: the current branch head builds without the conservative sync implementation entirely — the And good to hear you have an NFD iOS implementation — our gate/stub was purely to unblock configure, so if you publish yours in any form we'd be happy to test it on device and help get the on-device installer working. |
|
@Markos-Th09 To make the playthrough testing as useful as possible — which specific spots would you prioritize?
Happy to run targeted repro attempts on the iPhone 16 Pro and pull crash reports / full thread dumps for whatever you point at. |
It's a been a while so I don't remember exactly and I will have to verify it again. It wasn't very consistent. Could you please state exactly which levels you have completed sucessfully? I had just completed Act 1 and the issues occurred when I tried to go into Act 2. I did not complete any night acts. |
Doesn't launch on iPad Pro M4 8GB iPadOS 26.6.2. https://github.com/Markos-Th09/UnleashedRecomp/releases/tag/v1.0.3-beta%2Bios This build launches, works until the end of the opening cutscene and crashes during the loading screen for the first level. |
|
@anteyeintelligence Thanks for testing — first iPad report! To narrow it down, could you share:
The iPhone 16 Pro runs this exact IPA fine, so an iPad-specific launch failure is very interesting — the crash log should tell us immediately whether it's a signing/entitlement issue or something in the port itself. |
|
@Markos-Th09 Exact list so far, all on the iPhone 16 Pro running our Completed — zero deadlocks, hangs or crashes:
Most of that was one continuous ~48-minute session (plus earlier shorter ones), including all the loads, cutscenes, world-map/hub transitions and plenty of menu round-trips in between — the infinite-load-on-returning-to-menu from your fork's issue #1 hasn't shown up either. Only perf note: FPS dips during heavy combat / mass object destruction, more noticeable in day stages than night ones. If by "going into Act 2" you mean the secondary/extra acts rather than the main story acts, we haven't specifically targeted those yet — that's next on the list to hit your exact repro point, along with Spagonia Day, the later continents and eventually Eggmanland as the stress test. |
|
@yorgunkral31 I have been able to reproduce your success so I will proceed to merge some of your changes to my branch. In the meanwhile, the focus should be shifted to resolving the very important suspend issue. Although I forgot to write a proper bug report for it on my repo, essentially when the app is suspended the swapchain will be invalidated causing all sorts of issues and crashes upon resumption. I had attempted many different methods to fix this to no avail. |
|
That's great to hear — happy for any of it to land in your branch, and feel free to reshape the commits however you like. On the suspend issue: we've been seeing the same class of problem from the other side. Backgrounding the app reliably ends in a We'll take a run at it. Rough plan: handle SDL's |
iOS caps third-party Metal apps at 60 Hz on iPhones unless CADisableMinimumFrameDurationOnPhone is declared, so the in-game 120 FPS setting had no effect on ProMotion displays.
|
@Markos-Th09 Glad to see the fixes landing! One heads-up while you're merging, because the biggest rendering fix is easy to miss: |
This has already been taken care of long before you even started, so I don't need your input on that. I guess this could be more explicit by pointing the submodules to forks of all these although I avoided this on this branch because those changes will eventually need to be upstreamed. |
|
New build compiled from the latest changes: https://github.com/Markos-Th09/UnleashedRecomp/releases/tag/v1.0.3-beta.ios%2B06026b1 |
|
On this IPA: https://github.com/Markos-Th09/UnleashedRecomp/releases/tag/v1.0.3-beta.ios%2B06026b1 The game does not crash on iPad Pro M4 8GB 13-inch, launched in LiveContainer, iPadOS 26.6.2. Heres what I learned.
Additionally, I have discovered a bug where taking a screenshot (this most likely also happens when going to the control center or any other system interruption, if the game doesn't crash) drops the frame-rate limit to 40fps. This also applies to in-game interruptions, which seems to be pretty arbitrary here. It doesn't trigger when pausing or doing anything specific, just randomly. Camera cuts in cutscenes seem to be a consistent cause. The opening real-time cutscene was perfectly flat 60fps, then the frame-rate cap randomly switched to 40fps, then back to 60fps when I skipped it. This is a known issue on ProMotion iPads, where in many games, an interruption sets the frame-rate limit to 2/3 of the refresh rate. I don't recall this ever presenting in a 60fps game, it's mainly in 120fps games. The Sonic Utopia iOS port is the only sideloaded game that I know of where this isn't present, and most 60fps sideloaded games don't have this at all. If anything in the setup process is broken, I wouldn't know, I had the game setup from before this update and I'm not willing to reset my app data and risk breaking it. |
iOS limits apps to 60 Hz on iPhones with ProMotion displays unless they declare CADisableMinimumFrameDurationOnPhone, so frame rates above 60 FPS had no effect there. iPads don't need it. Based on upstream pull request hedge-dev#1767 by Çağan Özcan. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HBtL1JSminRPnypJpP2HHW
iOS limits apps to 60 Hz on iPhones with ProMotion displays unless they declare CADisableMinimumFrameDurationOnPhone, so frame rates above 60 FPS had no effect there. iPads don't need it. Based on upstream pull request hedge-dev#1767 by Çağan Özcan.
iOS limits apps to 60 Hz on iPhones with ProMotion displays unless they declare CADisableMinimumFrameDurationOnPhone, so frame rates above 60 FPS had no effect there. iPads don't need it. Based on upstream pull request hedge-dev#1767 by Çağan Özcan.
Overview
I am working on porting Unleashed Recompiled to iOS. Since this is currently early stage I am opening this for feedback and evaluating the possibility of including this upstream. This is currently not in a mergeable state and is intended for technical review, testing, and collaborative debugging.
This also requires modifications to submodules. I am already working on upstreaming the changes to plume to make it compatible with iOS (renderbag/plume#102). However, for nativefiledialog-extended, it would be unlikely that this could be upstreamed or accepted as the current implementation is very much incomplete and mobile operating systems don't seem to be within the scope of the library. How should this be handled? I have identified the following options
Known Blocking Issues
I have outlined all currently known in detail at my fork's issues page but to summarize:
RtlEnterCriticalSection/RtlLeaveCriticalSectionMarkos-Th09/UnleashedRecomp-iOS#1)Update: It doesn't occur on the native Metal backend by squidbus (Add support for Metal on macOS. #1648)
Compatibility
Since the game utilizes DXT/BC compressed textures, only very recent iOS devices natively support them. Specifically according to the Metal feature set tables:
This corresponds to:
The possibility of transcoding textures at installation time to another format like ASTC to improve compatibility could be considered in the future, but this adds significant complexity.