A mandelbrot set renderer in the browser, comparing the performance of: WebGPU
, WebGL
, HTML Canvas
, WASM
and HTML Canvas + MathJS
.
This is but an experiment to compare the performance of different technologies in the browser, the goal is to render the mandelbrot set in real time, and to be able to zoom and pan around with minimal latency.
The following technologies are used to render:
- WebGPU
- WebGL
- Canvas with raw ImageData manipulation
- WASM
- Canvas with raw ImageData manipulation + MathJS
The only target not widely supported is WebGPU, you can check the support here.
Note 1: I initially also made a renderer using plain Canvas API's, but since
fillRect
for each pixel is too slow, I decided to remove it from the comparison.
Note 2: For the WASM renderer, I used AssemblyScript to compile the code to WASM, and esbuild to bundle it. For some reason it is slower than the pure JS version, I'm not sure why, but I suspect it has something to do with the way I'm passing the data to the WASM module.
Note 3: For the Canvas + MathJS renderer, I used MathJS to do the calculations, and then I used the Canvas API to render the pixels. It is the slowest of all, but it is also the most accurate, since it uses arbitrary precision numbers.
Note 4: For WebGL, WebGPU and WASM I used 32 float numbers, which are easily changed to 64 float numbers, except on WebGPU where there is no support. This yields a accurate enough result, but does not allow for deep zooms.
Mouse secondary wheel to horizontal pan (Like the one in Logitech MxMaster3)
Name | Description |
---|---|
Eslint | For linting and semantic analysis |
Prettier | For code formatting |
Typescript | For static typing |
AssemblyScript | For WASM |
esbuild | For bundling |
gulp | For task automation |
SASS | For CSS preprocessing |
EJS | For HTML templating |
ThoseAwesomeGuys Prompts | For the Keyboard and gesture icons |
Browser sync | For live reloading |
Github actions | For CI, building and deploying to github pages |
Google fonts | For the Rubik font |
FontAwesome | For the favicon |
View Transition API | For the page transitions |
Vibrate API | For the haptic feedback |
- iPhone 13 Pro
- ROG Ally
- Macbook M1 Pro 14" 2021
- Mi Pad 5 Pro
- Windows Desktop
- Safari - iOS
- Safari - MacOS
- Chrome - iOS
- Chrome - MacOS
- Chrome - Android
- Edge - MacOS
- Edge - Windows