Performance optimization for 3D product configurators
Shoppers expect your 3D product configurator to load as quickly as a normal product page. Below is a deep dive into proven techniques we use inside Aircada (and that you can apply anywhere) to make sure large scenes feel instant on mobile and desktop.
1. Reduce model weight
Geometry is the biggest single contributor to initial load time. Every extra vertex costs bandwidth and GPU cycles. Aim for the lowest polygon count that keeps visual fidelity.
Pick the right target triangle budget
• Hero product: < 50 k triangles
• Swappable parts: 5 k – 10 k each
• Tiny bolts or screws: < 500
How to decimate in Blender
- Select your mesh and enter
Object Mode → Modifiers → Decimate
. - Start with a ratio of
0.5
. Inspect edges, then gradually lower until details suffer. - Apply the modifier, then run
Merge by Distance
to remove doubles.
Combine meshes
Each mesh spawns a draw call. Combine static parts that share a material (e.g. the left and right armrests of a chair) into one object before export.
Export as compressed glb
• Enable Draco or run gltfpack -c
after export.
• Expect a 60 – 80 % size drop vs. raw GLB.
2. Keep texture memory in check
Large PBR textures kill load times and overrun mobile GPUs. Follow these rules:
Resolution guidelines
- Main product shell: 2048 × 2048 max
- Small parts & decals: 1024 × 1024
- UI thumbnails: 256 × 256
Choose the right format
• WebP for color maps (sRGB).
• KTX2/BasisU for universal GPU‑friendly compression.
• PNG only when alpha precision is critical.
Reuse & tile
A 512 px seamless fabric tile repeated across UVs beats a unique wrapped 4 k texture every time.
3. Smart lighting and effects
Every extra light throws more math at the fragment shader. Balance realism with speed.
One key light + HDRI
A single directional light for highlights plus an environment map for soft ambient gives you realistic shading with just two passes.
Bake shadows when possible
If the camera is fixed (e.g., orbit only) bake AO and shadow onto texture channels or a vertex AO map. Disable realtime shadows on mobile.
Minimal post‑processing
• Use FXAA instead of MSAA for antialiasing.
• Enable bloom only when emissive parts glow.
• Skip SSAO, SSR, and depth‑of‑field unless your A/B test says conversion rises.
4. Stream assets just‑in‑time
Your shopper shouldn’t download every variant on first paint.
Lazy‑load option sets
When a configurator has 30 material swatches, load the base meshes first, then fetch the extra textures the second a user opens the material tab.
Use the browser cache
• Host GLBs and textures on a CDN with Cache‑Control: public, max‑age=31536000
.
• Bust the cache with query strings when you update files.
5. Draw only on change
Continuous requestAnimationFrame
renders waste battery when nothing moves.
Use an on‑demand render loop
• Start the loop when the user rotates, drags, or edits.
• Stop when movement settles (< 0.1 deg / frame).
• Resume on next interaction.
Denoising controls
For orbit controls, listen to start
and end
events to toggle the loop.
6. Adaptive quality
Not every device has an M3 chip. Detect performance and lower detail gracefully.
Dynamic pixel ratio
• Start at devicePixelRatio.
• Measure average FPS for 2 s.
• If FPS < 50, drop pixel ratio by 0.25 and re‑test.
Fallback textures
Serve 1 k textures to low‑RAM Android devices; 2 k to desktops. Detect via navigator.deviceMemory
.
Quick reference checklist
- Under 5 MB main GLB with Draco
- < 50 k tris
- Textures compressed & POT
- 1 directional light + HDRI
- Zero heavy post effects on mobile
- Lazy‑load secondary options
- Render on demand
- Adaptive pixel ratio
- CDN caching & long max‑age