Back to blog
3D

3D on Your Website Without Killing Performance: Our Playbook

Draco compression, GLB, lazy loading and a mobile fallback — how to ship heavy WebGL scenes and keep a 90+ Lighthouse score. The technical guide for business owners and developers.

July 7, 20269 min readThe Orel AI team

"We added a 3D model to the site and it dropped from 93 to 41 on Lighthouse" — that's the sentence we hear most when a client comes to us after a failed attempt. 3D and site speed don't have to be opposites. They walk a fine line, but once you understand the rules — both win.

The problem: why 3D slows a site down

A typical 3D model out of Blender or Cinema 4D weighs between 30 and several hundred megabytes. On top of that, WebGL makes the GPU and CPU work hard, leaving fewer resources for rendering the rest of the page. On a powerful desktop, you won't notice. On an iPhone 11 over 4G in traffic — the page freezes.

Step 1: preparing the model — up to 90% size reduction

GLB + Draco Compression

The right format for the web is GLB — a binary packaging of GLTF. But the real magic is Draco: Google's compression algorithm that shrinks model geometry by 80–95% with no visible quality loss. A 40MB model becomes 3MB. The command that's enough in most cases: `gltf-transform optimize input.glb output.glb --compress draco --texture-compress webp`.

Checking the polygon count

For the web, 50,000–100,000 polygons per scene is the comfortable maximum. Beyond that — stuttering. We decimate heavy models in Blender with the Decimate modifier: a 30–50% reduction while preserving the look.

Step 2: lazy loading and a fallback

  • Dynamic import: load the 3D library only when the user reaches the relevant part of the page — not on first load
  • Intersection Observer: the scene starts loading when 50% of it is in the viewport
  • Suspense + fallback: while loading, show a placeholder (a CSS animation, a static image, a branded spinner) — not a blank screen
  • Mobile detection: on screens under 768px we usually show a static rendered image of the scene. Barely noticeable and slows nothing down
A better approach than a mobile fallback? Run a mobile-optimized version of the scene. A more practical approach? A fallback. Choose based on how central 3D is to the experience.

Step 3: Spline vs Three.js vs React Three Fiber — what we chose and when

Spline: the fastest to ship, the least control over optimization. Great for decorative scenes and demos. It's what we use on this very site — the scene you see is Spline, combined with lazy loading that fetches it only when you reach the relevant section. React Three Fiber: full control, scroll-driven animation, full user interaction. The choice for product sites and configurators. Vanilla Three.js: for maximum performance and dashboard-style renders — when even a few KB of JavaScript matter.

The score after optimization

With this playbook, our 3D projects reach 85–95 on Lighthouse Performance on desktop, and 75–88 on mobile. LCP (Largest Contentful Paint) under 2.5 seconds. Zero CLS — the scene causes no layout shift because it has a fixed-height placeholder.

Want a 3D experience on your website that won't slow it down? Let's see what fits.

See 3D development

FAQ

Do you need Three.js for a 3D website, or is Spline enough?
Spline is enough for most brand websites. Three.js and R3F are needed when you want deep user interaction, scroll-driven animations, or a product configurator. We'll tell you honestly what fits.
What's a reasonable load time for a page with 3D?
With our playbook: LCP under 2.5 seconds even with 3D, because the model loads in the background and doesn't block the First Contentful Paint.
What about GPU load on an old iPhone?
That's why we have the mobile fallback. When we detect mobile or a weak GPU via the navigator, we serve a static image. The experience is still beautiful — and fast.

Have a question the article didn't answer? Ask us directly

A short, free discovery call — answers specific to your business, not theory.