Skip to main content

Overview

Helios is designed for production-grade video rendering. This guide covers performance optimization strategies for both preview and render workflows.

Rendering performance

Choose the right rendering path

Helios supports two rendering modes: Canvas mode (faster)
  • Direct WebCodecs encoding
  • GPU-accelerated
  • Best for: Three.js, Pixi.js, Canvas API
DOM mode (versatile)
  • Screenshots HTML/CSS/SVG
  • Works with any web content
  • Best for: Text, layouts, complex CSS

Enable hardware acceleration

GPU acceleration is enabled by default, but you can verify:
Supported hardware acceleration:
  • H.264 - Most common, best compatibility
  • VP8/VP9 - WebM format
  • AV1 - Newer, better compression (slower)

Bitrate and quality

Higher bitrate = better quality but larger files:

Codec selection

H.264 provides the best speed/quality balance:
Preset recommendations:
  • ultrafast - Quick tests (low quality)
  • medium - Production (balanced)
  • slow - Final export (best quality)

Frame rate optimization

Lower frame rates render faster:
Frame rate guidelines:
  • 24 fps - Cinematic look
  • 30 fps - Standard web video
  • 60 fps - Smooth motion, gaming

Resolution optimization

Render at target resolution, not higher:
Avoid rendering at 4K and downscaling to 1080p. Render at 1080p directly for 4x faster encodes.

Preview performance

Disable autoplay animations

Helios controls timing, so disable auto-playing animations:
Use autoSyncAnimations: true to automatically pause animations:

Use requestAnimationFrame efficiently

Helios uses RafTicker by default, which is optimized for browser rendering:
For Node.js or testing, use TimeoutTicker:

Debounce expensive operations

Avoid recalculating on every frame if not needed:

Optimize asset loading

Preload assets before starting playback:
The waitUntilStable() method waits for:
  • Fonts (document.fonts.ready)
  • Images (img.decode())
  • Audio/video metadata

Shadow DOM performance

DomDriver automatically discovers shadow roots, but deep nesting impacts performance:

Memory optimization

Dispose resources

Always clean up when done:
For Three.js, dispose geometries and materials:

Reuse objects

Avoid creating new objects every frame:

Limit subscriber count

Each subscriber adds overhead:

Distributed rendering

For large projects, use distributed rendering:
This splits rendering across multiple workers for 4x speedup.

Chunk size optimization

More chunks = more parallelism, but more overhead:
Rule of thumb: 1 chunk per 10-15 seconds of video

Profiling and debugging

Measure render time

Monitor frame budget

Each frame has a time budget. For 30fps, that’s 33.3ms per frame:

Diagnose bottlenecks

Use Chrome DevTools to profile:
Then:
  1. Open chrome://inspect
  2. Click “inspect” on your composition
  3. Use Performance tab to record

Check diagnostics

Benchmarking examples

Typical render speeds on modern hardware (M1 MacBook Pro): Real-time factor:
  • 1x = Renders as fast as playback (10s video in 10s)
  • 2x = Renders twice as fast (10s video in 5s)
  • 0.5x = Renders half speed (10s video in 20s)

Performance checklist

Rendering:
  • ✅ Use canvas mode for canvas-heavy compositions
  • ✅ Enable GPU acceleration
  • ✅ Choose appropriate bitrate (2-5 Mbps for 1080p)
  • ✅ Use H.264 codec for best compatibility
  • ✅ Render at target resolution (don’t downscale)
  • ✅ Use distributed rendering for videos > 30s
Preview:
  • ✅ Set autoSyncAnimations: true
  • ✅ Preload assets with waitUntilStable()
  • ✅ Use single subscriber when possible
  • ✅ Avoid per-frame allocations
  • ✅ Reuse Three.js geometries and materials
Memory:
  • ✅ Call helios.dispose() when done
  • ✅ Dispose Three.js resources
  • ✅ Reuse objects instead of creating new ones
  • ✅ Clear intervals and event listeners

Next steps