For a week, JellySplit stuttered on iPhone 11. Every swap dropped a handful of frames on-device, while newer phones and the simulator felt perfect. If you played the game in early March and wondered why it felt heavier than it should — you weren’t imagining it. Here’s the short version of what was wrong and what we did about it.
iPhone 11 is our floor device
JellySplit is built to run on the oldest iPhone we still support — the iPhone 11 — with the same feel as a brand-new one. That phone has less memory to work with than any newer model, which means it’s the one phone where sloppy rendering actually shows up. If the game feels great on iPhone 11, it feels great everywhere.
The downside is that most bugs that only hurt iPhone 11 don’t show up on the simulator, don’t show up on a 12, and don’t show up when you’re just running the app in the IDE. We only found the swap lag because we play on an iPhone 11 every day.
It wasn’t one bug — it was three
The first thing we thought we found turned out to be the first of three stacked mistakes. Fixing any one of them alone made the swap feel a little better. Fixing the biggest one made it feel mostly better — which is the most dangerous place to stop, because “mostly” is close enough to ship. We kept going until iPhone 11 was as smooth as everything else.
In plain English, the three things we were doing wrong:
- The board was being thrown away and rebuilt on every swap. A bit of internal bookkeeping that was supposed to run only when the puzzle changed was running every time you moved a jelly. That alone made every swap cost more work than it should have.
- Each hex cell was being re-created every time its color changed. Swapping two jellies should just update their colors. Instead, we were tearing down the two cells entirely and building fresh ones — which forced their artwork to reload from scratch even though we already had it cached.
- The sprite artwork was way bigger than the screen. Every jelly sprite was being stored at roughly four times the resolution we actually needed. On iPhone 11, keeping that much art in memory eventually forced the phone to start swapping artwork in and out — which meant the occasional swap had to wait on the artwork reloading mid-move.
What you’ll notice now
If you play on a newer phone, you won’t notice anything different — it already felt fine there. If you play on an iPhone 11 (or any older phone in that class), swaps should now feel instant, even deep into a long session. The app is also a chunk smaller to download: we shaved about 57 MB off the bundle as a free side effect of shipping the right-sized artwork.
And the part we actually feel proud of — there’s now an automated test that fails if anyone accidentally reintroduces the second bug. We may ship a new version of the game with a subtle rendering change, but we won’t ship one that causes iPhone 11 to re-load its jelly artwork on every swap. That specific regression is locked down.
For developers
The full engineering writeup — the SVG key that accidentally depended on every move, the React.memo comparator that skips onPress on purpose, and the math on why 2 MB decoded bitmaps blow up an iPhone 11’s cache — lives on the Island & Pine studio blog: One perf bug is three bugs: a remounting SVG, un-memoized cells, and 2 MB sprite decodes on iPhone 11.