File size and performance get treated as the same problem because both are solved by making things smaller, but they are not. A 400 KB creative that decodes twelve large textures on startup and then runs a thousand particles can be slower than a 1.5 MB one that does neither. Size determines whether the ad arrives; what happens after it arrives is a separate engineering question, and it is the one that decides whether the first three seconds you designed are actually experienced.
Why load time is a delivery problem, not just a UX one
In an in-app bidding auction, a creative that loads slowly loses impressions to one that does not, independently of how good it is. The container has a window in which to render; miss it and the impression is either lost or served with the first seconds burned. This is why several networks recommend going well below their own published caps — AppLovin says outright that smaller files perform better, and Liftoff advises under 700 KB for a creative without video against a 5 MB ceiling.
The practical implication is that the size cap is a rejection threshold and the performance target is a different, much lower number. Treating 5 MB as the goal produces a compliant ad that quietly under-delivers.
What actually happens between download and first frame
Four stages, and file size only governs the first. The container downloads the file; the browser parses the HTML and the inlined base64; the runtime decodes images into GPU textures; the scene graph is built and the first frame renders.
Decoding is the stage people forget and it is frequently the longest. A base64 data URI has to be decoded from text to bytes, then the image decoded from PNG or WebP into a raw bitmap, then uploaded to the GPU. A 2048×2048 texture is 16 MB in memory regardless of how well it compressed on disk, and on a mid-range phone that upload is measurably slow. Ten of them at startup is a visible stall that no amount of file-size optimisation fixes.
The rule that follows from this
Texture dimensions matter more than file bytes for startup time. A 2048×2048 PNG that compresses to 80 KB still costs 16 MB of GPU memory and a slow upload; a 512×512 version costs one sixteenth of that. Right-size to what is displayed before you optimise compression.
The device that matters is not yours
Playable ads are served overwhelmingly into games, and the audience for casual mobile games skews to older and cheaper hardware than the phone in a marketer's pocket. A creative tested only on a current flagship has been tested on the best case, and the failure mode on a three-year-old mid-range Android is not a crash — it is a stutter during the exact moment you were relying on to feel good.
One mid-range Android in the test set changes what you build. Effects that looked free stop looking free, and the discipline that follows is usually good for the creative anyway.
What costs frames
- Particle counts tuned on a desktop. Each live particle is drawn every frame; short lifetimes and modest emission give the same perceived impact for a fraction of the cost.
- Full-screen filters and blurs, which are per-pixel work on a screen with a lot of pixels.
- Large transparent overlays stacked on top of each other, which force the GPU to blend the same pixels repeatedly.
- Text re-rendered every frame rather than drawn once and reused.
- Animating layout properties instead of transform and opacity, which forces a re-layout each frame.
- Timers running work that only needs to happen on an event.
The pattern in that list is repetition: the expensive things are the ones that happen on every frame rather than once. A single 200-particle burst on a win is cheap; 200 particles continuously for the whole ad is not, and it usually adds nothing.
Startup order, and why it is worth controlling
The first frame does not need every asset. The end card artwork, the celebration effect and the second level's tiles are all needed later, and decoding them before the first interaction delays the moment the ad becomes playable. Loading what the opening state needs and deferring the rest measurably shortens the gap between arrival and interactivity, which is the only load metric a viewer experiences.
The same logic applies to audio: decoding an audio buffer at startup for a cue that plays on success spends time you needed for something else.
How to measure it honestly
Remote-debug the creative on a real device and record a performance trace of the first ten seconds. Two numbers matter: the time from navigation to the first interactive frame, and the frame timing through the busiest moment. Everything else is diagnosis.
Do it over a throttled connection as well as a fast one. A creative that is comfortable on office wifi and marginal on mobile data is a creative that behaves differently for most of the people who see it, and that difference will show up in delivery long before anyone attributes it to load time.
The trade-off worth making
Almost every performance decision here trades visual richness for reliability, and in an ad that trade is easier than in a game. A game has a session long enough for a player to forgive a stutter; an ad has a few seconds in which stutter is indistinguishable from the thing being broken. Given a choice between one more effect and a steady frame rate on a mid-range phone, the frame rate is worth more than the effect almost every time.
Memory, and the failure that looks like a crash
Frame rate is the visible performance problem; memory is the one that ends the ad outright. Mobile webviews run under a memory ceiling, and a creative that allocates too much — usually through oversized textures rather than through code — is terminated by the operating system rather than slowed down. To a viewer that is indistinguishable from the ad being broken, and it will not appear in a performance trace because the process is simply gone.
The defence is the same discipline that helps frame rate: right-size textures, release what is no longer needed when a scene changes, and avoid holding several full-screen render targets at once. A creative that runs comfortably on a device with plenty of free memory can still fail on that same device when a game is already resident behind it — which, in an in-app ad, it always is.
Create playable end cards in minutes—no code required.
Open Playable Ads Maker