Fast Anywhere
The studio's games were heavy and high-end, and its players were on budget phones and poor connections. I built the core so the games load in under two seconds and stay smooth anyway.
First spin in under two seconds
The problem
The studio's biggest markets had poor internet connections. A game that keeps players staring at a loading bar loses them: they click off, and next time they pick a game that loads fast.
What I did
I built the loading so that only what the first spin needs loads before the player is in, with every lane of the device working at once: downloads run in parallel from the first moment, assets are prepared on other threads, and building and first rendering are interleaved with them, so the network, the CPU and the GPU never wait on each other.
I made everything else stream in while they play. Every spin's result arrives as stages, so the game sees a feature coming and has its files ready before it's needed.
Smooth on budget phones
The problem
The heaviest moments, bonus spins and big-win celebrations, were exactly where low-end devices dropped below a playable frame rate. Those phones are common in the markets the studio was growing into, and a stuttering spin reads as a cheap game.
What I did
I made dynamic resolution the last resort, after a long list of optimisations that took the cost out at the source. Only the moments that still struggled after all that drop resolution.
I built dynamic resolution into the core. It watches the frame rate, scene by scene. When a moment starts to struggle, it renders fewer pixels, one step at a time and only as far as that moment needs, and upscales the result. When there's headroom again, the detail comes back. It learns which scenes strain each device, so it steps down before a heavy moment rather than after the player has seen a hitch.
Capable phones never leave full quality; budget phones trade a little sharpness for a game that stays fluid. I put it in the core, so every game gets it with no extra work.
