three-best-practices

Three.js performance optimization and best practices guidelines. Use when writing, reviewing, or optimizing Three.js code. Triggers on tasks involving 3D scenes, WebGL/WebGPU rendering, geometries, materials, textures, lighting, shaders, or TSL.

By emalorenzo · 1,092 installs

npx skills add emalorenzo/three-agent-skills --skill three-best-practices

Source repository · Upstream listing

Three.js Best Practices Comprehensive performance optimization guide for Three.js applications. Contains 120+ rules across 18 categories, prioritized by impact. Sources & Credits This skill compiles best practices from multiple authoritative sources: Official guidelines from Three.js llms branch maintained by [mrdoob](https://github.com/mrdoob) [100 Three.js Tips](https://www.utsubo.com/blog/threejs best practices 100 tips) by [Utsubo](https://www.utsubo.com) Excellent comprehensive guide covering WebGPU, asset optimization, and performance tips When to Apply Reference these guidelines when: Setting up a new Three.js project Writing or reviewing Three.js code Optimizing performance or fixing memory leaks Working with custom shaders (GLSL or TSL) Implementing WebGPU features Building VR/AR experiences with WebXR Integrating physics engines Optimizing for mobile devices Rule Categories by Priority Priority Category Impact Prefix 0 Modern Setup & Imports FUNDAMENTAL setup 1 Memory Management & Dispose CRITICAL memory 2 Render Loop Optimization CRITICAL render 3 Draw Call Optimization CRITICAL drawcall 4 Geometry & Buffer Management HIGH geometry 5 Material & Texture Optimization HIGH material 6 Asset Compression HIGH asset 7 Lighting & Shadows MEDIUM HIGH lighting 8 Scene Graph Organization MEDIUM scene 9 Shader Best Practices (GLSL) MEDIUM shader 10 TSL (Three.js Shading Language) MEDIUM tsl 11 WebGPU Renderer MEDIUM webgpu 12 Loading & Assets MEDIUM loading 13 Core Web Vitals MEDIUM HIGH vitals 14 Camera & Controls LOW MEDIUM camera 15 Animation System MEDIUM animation 16 Physics Integration MEDIUM physics 17 WebXR / VR / AR MEDIUM webxr 18 Audio LOW MEDIUM audio 19 Post Processing MEDIUM postpro 20 Mobile Optimization HIGH mobile 21 Production HIGH error , migration 22 Debug & DevTools LOW debug Quick Reference 0. Modern Setup (FUNDAMENTAL) setup use import maps Use Import Maps, not old CDN scripts setup choose renderer WebGLRenderer (default) vs WebGPURenderer (TSL/compute) setup animation loop Use renderer.setAnimationLoop() not manual RAF setup basic scene template Complete modern scene template 1. Memory Management (CRITICAL) memory dispose geometry Always dispose geometries memory dispose material Always dispose materials and textures memory dispose textures Dispose dynamically created textures memory dispose render targets Always dispose WebGLRenderTarget memory dispose recursive Use recursive disposal for hierarchies memory dispose on unmount Dispose in React cleanup/unmount memory renderer dispose Dispose renderer when destroying view memory reuse objects Reuse geometries and materials 2. Render Loop (CRITICAL) render single raf Single requestAnimationFrame loop render conditional Render on demand for static scenes render delta time Use delta time for animations render avoid allocations Never allocate in render loop render cache computations Cache expensive computations render frustum culling Enable frustum culling render update matrix manual Disable auto matrix updates for static objects render pixel ratio Limit pixel ratio to 2 render antialias wisely Use antialiasing judiciously 3. Draw Call Optimization (CRITICAL) draw call optimization Target under 100 draw calls per frame geometry instanced mesh Use InstancedMesh for identical objects geometry batched mesh Use BatchedMesh for varied geometries (same material) geometry merge static Merge static geometries with BufferGeometryUtils 4. Geometry (HIGH) geometry buffer geometry Always use BufferGeometry geometry merge static Merge static geometries geometry instanced mesh Use InstancedMesh for identical objects geometry lod Use Level of Detail for complex models geometry index buffer Use indexed geometry geometry vertex count Minimize vertex count geometry attributes typed Use appropriate typed arrays geometry interleaved Consider interleaved buffers 5. Materials & Textures (HIGH) material reuse Reuse materials across meshes material simplest sufficient Use simplest material that works material texture size power of two Power of two texture dimensions material texture compression Use compressed textures (KTX2/Basis) material texture mipmaps Enable mipmaps appropriately material texture anisotropy Use anisotropic filtering for floors material texture atlas Use texture atlases material avoid transparency Minimize transparent materials material onbeforecompile Use onBeforeCompile for shader mods (or TSL) 6. Asset Compression (HIGH) asset compression Draco, Meshopt, KTX2 compression guide asset draco 90 95% geometry size reduction asset ktx2 GPU compressed textures (UASTC vs ETC1S) asset meshopt Alternative to Draco with faster decompression asset lod Level of Detail for 30 40% frame rate improvement 7. Lighting & Shadows (MEDIUM HIGH) lighting limit lights Limit to 3 or fewer active lights lighting shadows advanced PointLight cost, CSM, fake shadows lighting bake static Bake lighting for static scenes lighting shadow camera tight Fit shadow camera tightly lighting shadow map size Choose appropriate shadow resolution (512 4096) lighting shadow selective Enable shadows selectively lighting shadow cascade Use CSM for large scenes lighting shadow auto update Disable autoUpdate for static scenes lighting probe Use Light Probes lighting environment Environment maps for ambient light lighting fake shadows Gradient planes for budget contact shadows 8. Scene Graph (MEDIUM) scene group objects Use Groups for organization scene layers Use Layers for selective rendering scene visible toggle Use visible flag, not add/remove scene flatten static Flatten static hierarchies scene name objects Name objects for debugging object pooling Reuse objects instead of create/destroy 9. Shaders GLSL (MEDIUM) shader precision Use mediump for mobile (~2x faster) shader mobile Mobile specific optimizations (varyings, branching) shader avoid branching Replace conditionals with mix/step shader precompute cpu Precompute on CPU shader avoid discard Avoid discard, use alphaTest shader texture lod Use textureLod for known mip levels shader uniform arrays Prefer uniform arrays shader varying interpolation Limit varyings to 3 for mobile shader pack data Pack data into RGBA channels shader chunk injection Use Three.js shader chunks 10. TSL Three.js Shading Language (MEDIUM) tsl why use Use TSL instead of onBeforeCompile tsl setup webgpu WebGPU setup for TSL tsl complete reference Full TSL type system and functions tsl material slots Material node properties reference tsl node materials Use NodeMaterial classes tsl basic operations Types, operations, swizzling tsl functions Creating TSL functions with Fn() tsl conditionals If, select, loops in TSL tsl textures Textures and triplanar mapping tsl noise Built in noise functions (mx noise float, mx fractal noise) tsl post processing bloom, blur, dof, ao tsl compute shaders GPGPU and compute operations tsl glsl to tsl GLSL to TSL translation 11. WebGPU Renderer (MEDIUM) webgpu renderer Setup, browser support, migration guide webgpu render async Use renderAsync for compute heavy scenes webgpu feature detection Check adapter features webgpu instanced array GPU persistent buffers webgpu storage textures Read write compute textures webgpu workgroup memory Shared memory (10 100x faster) webgpu indirect draws GPU driven rendering 12. Loading & Assets (MEDIUM) loading draco compression Use Draco for large meshes loading gltf preferred Use glTF format gltf loading optimization Full loader setup with DRACO/Meshopt/KTX2 loading progress feedback Show loading progress loading async await Use async/await for loading loading lazy Lazy load non critical assets loading cache assets Enable caching loading dispose unused Unload unused assets 13. Core Web Vitals (MEDIUM HIGH) core web vitals LCP, FID, CLS optimization for 3D vitals lazy load Lazy load 3D below the fold with IntersectionObserver vitals code split Dynamic import Three.js modules vitals preload Preload critical assets with link tags vitals progressive loading Low res to high res progressive load vitals placeholders Show placeholder geometry during load vitals web workers Offload heavy work to workers vitals streaming Stream large scenes by chunks 14. Camera & Controls (LOW MEDIUM) camera near far Set tight near/far planes camera fov Choose appropriate FOV camera controls damping Use damping for smooth controls camera resize handler Handle resize properly camera orbit limits Set orbit control limits 15. Animation (MEDIUM) animation system AnimationMixer, blending, morph targets, skeletal 16. Physics (MEDIUM) physics integration Rapier, Cannon es integration patterns physics compute shaders GPU physics with compute shaders 17. WebXR (MEDIUM) webxr setup VR/AR buttons, controllers, hit testing 18. Audio (LOW MEDIUM) audio spatial PositionalAudio, HRTF, spatial sound 19. Post Processing (MEDIUM) postprocessing optimization pmndrs/postprocessing guide postpro renderer config Disable AA, stencil, depth for post postpro merge effects Combine effects in single pass postpro selective bloom Selective bloom for performance postpro resolution scaling Half resolution for 2x FPS postpro webgpu native TSL based post for WebGPU 20. Optimization (HIGH) mobile optimization Mobile specific optimizations and checklist raycasting optimization BVH, layers, GPU picking 21. Production (HIGH) error handling recovery WebGL context loss and recovery migration checklist Breaking changes by version 22. Debug & DevTools (LOW) debug devtools Complete debugging toolkit debug stats gl stats gl for WebGL/WebGPU monitoring debug lil gui lil gui for live parameter tweaking debug spector Spector.js for WebGL frame capture debug renderer info Monitor draw calls and memory debug three mesh bvh Fast raycasting with BVH debug context lost Handle WebGL context loss debug animation loop profiling Profile render loop sections debug conditional Remove debug code in production How to Use Read individual rule files for detailed explanations and code examples: Each rule file contains: Brief explanation of why it matters BAD code example with explanation GOOD code example with explanation Additional context and references Key Patterns Modern Import Maps Proper Disposal TSL Basic Usage Mobile Detection