Three.js Performance Checklist: 24 Essential Steps
Three.js performance problems don't show up in Lighthouse — they show up as dropped frames, hot phones, and crashed browser tabs. The GPU, CPU, and memory each have separate budgets, and exceeding any one of them tanks your frame rate. This checklist covers the optimizations that actually matter, from geometry batching to proper resource disposal.
Geometry & Draw Calls
Reduce the number of draw calls and the amount of geometry data sent to the GPU each frame.
Textures & Materials
Optimize texture memory usage and material compilation to reduce GPU pressure and load times.
Rendering & Frame Budget
Stay within your frame budget by controlling what gets rendered and how.
Memory Management & Disposal
Prevent memory leaks that cause crashes and degraded performance over time.
Loading & Asset Pipeline
Optimize how assets are loaded, parsed, and prepared for rendering.
Pro Tips
- -Install the Spector.js browser extension to capture and inspect individual WebGL draw calls. It shows you exactly what the GPU renders each frame, which textures are bound, and which shaders are compiled — invaluable for finding hidden performance costs.
- -Use `renderer.info` as your primary performance dashboard. Log `render.calls` (draw calls), `render.triangles` (total triangles), `memory.geometries`, and `memory.textures` each frame to spot regressions immediately.
- -For React Three Fiber projects, wrap expensive components in `React.memo` and use `useFrame` with a conditional check instead of updating every frame. R3F's declarative model makes it easy to accidentally trigger full scene re-renders on state changes.
- -Test on the lowest-spec device your audience uses, not your development machine. A scene that runs at 60fps on a MacBook Pro might run at 8fps on a 3-year-old Android phone. Chrome DevTools CPU throttling helps, but real device testing is essential.