Plotting Fractals in WebAssembly
Plotting Fractals in WebAssembly
Previous | Top | Next |
---|---|---|
3: Basic WAT Implementation | 4: Optimised WAT Implementation | 5: Plotting a Julia Set |
4.1 Check for Early Bailout | 4.2: Modify the Render Loop |
4.2: Modify the Render Loop
In our previous implementation of the WAT function mandel_plot
, we simply looped around every pixel in the image:
- Converting each pixel’s location to the corresponding coordinates on the complex plane, then
- Arbitrarily calling function
escape_time_mj
Now, before calling function escape_time_mj
, we must first check where the current pixel is located.
If it lies within either the main cardioid or the period 2 bub, we can skip the call escape_time_mj
and simply return the colour black.
The innermost if
expression in function mandel_plot
has now been extended to perform this additional test:
;; Store the current pixel's colour using the value returned from the following if expression
(i32.store
(local.get $pixel_offset)
(if (result i32)
;; Can we avoid running the escape-time algorithm?
(call $early_bailout (local.get $x_coord) (local.get $y_coord))
;; Yup, so we know this pixel will be black
(then (global.get $BLACK))
;; Nope, we can't bail out early
(else
(if (result i32)
;; Same coding as before
)
)
)
)
Just by the addition of this simple test, we have shortened the render time by a factor of about 6!
Here’s an implementation of the optimised WAT coding