HTML5 Game FPS Boost: 9 Tips That Actually Help
HTML5 Game FPS Boost: 9 Tips That Actually Help
Honesty note: these are the techniques I’d apply to my Phaser game and the order I’d apply them — the method (profile first) matters more than the list (my 60fps guide). Tip 0 is real: without profiling, tips 1–9 are guesses.
The 9 tips
0. Profile before you optimize. Get the frame-time breakdown (DevTools Performance) and find the actual bottleneck — draw calls, GC, or logic. “The game is slow” is not a diagnosis; “60% of frame time is the physics step” is (the budget).
-
One texture atlas per style layer. Batching is the renderer’s biggest lever: separate images = separate draw calls; one atlas = one call. Combine sprites/UI into atlases (asset pipeline).
-
Cull what isn’t on screen. No renderer draws off-screen objects for you in every case — add simple bounds checks (object.x + w < 0, etc.) and skip updates/renders outside the viewport (camera reality).
-
Object pools for spawn/despawn.
create+destroyper bullet/fish allocates and GC-churns; pool them: pre-create N, recycle by index (loop reality). -
Cap tweens and particles. Tweens are cheap individually, expensive at scale: cap simultaneous tweens, and cap particles (e.g. max 200 on-screen, oldest first) instead of spawning freely (tween guide).
-
No per-frame allocations. Strings, arrays, and closures created in the update loop force GC pauses; reuse scratch objects and avoid
filter/mapin hot paths. -
Know your physics scope. Arcade physics is fine for casual games; complex per-frame collision checks across hundreds of bodies are not. Use broad-phase culling, bigger colliders, or fewer bodies (physics decision).
-
Right-size textures and use power-of-two where the renderer wants it. A 1024px sprite on a 64px object wastes memory and fill rate; compress and downscale (asset sizes).
-
Watch the WebGL state.
roundPixels, batch size, and texture filters are cheap wins; avoid texture re-uploads mid-frame (put dynamic content on one texture). -
Measure after every change. Optimize one thing, re-profile, keep it only if it helped. “It feels smoother” is not a measurement (the 60fps method).
The honest order (what I’d do first)
- Profile → 2. Atlas + cull (cheapest, biggest) → 3. Pool hot objects → 4. Caps (tweens/particles) → 5. GC hygiene → then the niche stuff. Most casual H5 games plateau after steps 1–4; steps 5–9 are for when the frame budget is still red after the cheap wins.
Pitfalls
- Optimizing before profiling — you’ll polish the wrong thing (usually the thing that’s already fine).
- Micro-optimizing logic — a few ms of JS is nothing vs one draw call or one GC pause.
- Uncapped particle systems — the classic FPS cliff; cap and reuse.
- Per-frame
new— hidden allocation = hidden GC; pool or reuse. - No before/after measurement — without numbers you can’t tell if a change helped or is placebo.
Bottom line
FPS work is 20% technique and 80% order: profile → atlas → cull → pool → cap → GC hygiene, measuring after each step. Nine tips matter less than the method (the full 60fps guide) — start with the frame-time breakdown, and most casual games are fixed by the four cheap wins before the niche tricks.