d3-force-webgpu
Version:
Force-directed graph layout using velocity Verlet integration with WebGPU acceleration.
107 lines (68 loc) • 3.01 kB
Markdown
# d3-force-webgpu
GPU-accelerated force-directed graph layout using WebGPU compute shaders.
This module extends [d3-force](https://github.com/d3/d3-force) with WebGPU acceleration, providing **10-100x speedup** for large graphs while maintaining full API compatibility.
## Features
- **WebGPU Compute Shaders**: Force calculations run entirely on the GPU
- **Drop-in Replacement**: Same API as `forceSimulation`, just use `forceSimulationGPU`
- **Automatic Fallback**: Falls back to CPU if WebGPU is unavailable
- **All Forces Supported**: Many-body, link, collision, center, x, y, and radial forces
## Installation
```bash
npm install d3-force-webgpu
```
## Usage
```javascript
import {
forceSimulationGPU,
forceManyBody,
forceLink,
forceCenter,
checkWebGPUSupport
} from 'd3-force-webgpu';
// Check WebGPU availability
const gpuAvailable = await checkWebGPUSupport();
console.log('WebGPU:', gpuAvailable ? 'enabled' : 'CPU fallback');
// Create GPU-accelerated simulation
const simulation = forceSimulationGPU(nodes)
.force('charge', forceManyBody().strength(-30))
.force('link', forceLink(links).distance(30))
.force('center', forceCenter(width / 2, height / 2))
.on('tick', render);
// Wait for GPU initialization
await simulation.gpuReady();
// Start simulation
simulation.restart();
```
## API
### forceSimulationGPU([nodes])
Creates a new GPU-accelerated simulation with the specified array of nodes. This has the same API as `forceSimulation` with additional methods:
#### simulation.isGPUEnabled()
Returns `true` if WebGPU acceleration is active.
#### simulation.gpuReady()
Returns a Promise that resolves when the GPU is initialized and ready.
### checkWebGPUSupport()
Returns a Promise that resolves to `true` if WebGPU is available.
### isWebGPUAvailable()
Synchronously returns `true` if the WebGPU API exists (doesn't check adapter availability).
## Browser Support
WebGPU is supported in:
- Chrome 113+ (Windows, macOS, ChromeOS)
- Edge 113+
- Firefox Nightly (behind flag)
- Safari Technology Preview
For unsupported browsers, the simulation automatically falls back to CPU computation.
## How It Works
The simulation uses WebGPU compute shaders to parallelize force calculations:
1. **Many-Body Force**: Tile-based N-body algorithm with O(n²) complexity but massive parallelization across GPU cores
2. **Link Force**: Per-node parallel computation of spring forces
3. **Collision Force**: Tile-based collision detection with GPU-accelerated overlap resolution
4. **Integration**: Parallel position updates with velocity Verlet
Node data is stored in GPU buffers and synced back to JavaScript only when needed for rendering.
## Original d3-force
This module is based on [d3-force](https://github.com/d3/d3-force) by Mike Bostock.
## Resources
* [D3 Force Documentation](https://d3js.org/d3-force)
* [D3 Force Examples](https://observablehq.com/collection/@d3/d3-force)
* [WebGPU Specification](https://www.w3.org/TR/webgpu/)
## License
ISC