Tuesday, February 16, 2021

Glimmer DSL for SWT Mandelbrot Fractal and Hello, Cursor! Samples


It includes two new samples:
  • Mandelbrot Fractal: this is a very well known Computer Science/Math algorithm that renders a fractal at various zoom levels, demonstrating the repetitive nature of fractals. During my bachelor of Computer Science at McGill University (Montreal, QC, Canada), I remember spending very long and tiring nights at the computer lab to implement an Assembly language renderer of the Mandelbrot Fractal. Much has changed since then. We have multi-core processors today, let alone the wonderful Ruby programming language, so I wrote this with Glimmer DSL for SWT by taking advantage of the multi-threaded JRuby and saturating all CPU cores to finish calculating Mandelbrot points in less than 10 seconds on 4 CPU cores. It takes advantage of the idea of Thread Pools, resulting in very terse multi-threaded code, which is implemented using concurrent-ruby, a multi-threading library included in Glimmer. The sample supports unlimited zooming, pre-calculated in the background with the window title bar notifying you once higher zooms are available. It also allows panning with scrollbars or mouse dragging. Enjoy!
  • Hello, Cursor!: introduces the various mouse cursors available out of the box in SWT.

Mandelbrot Fractal Sample

Hello, Cursor! Sample

Below is the multi-threaded model code and Glimmer GUI DSL code of the Mandelbrot Fractal initial version (without zooming). The way I parallelized processing is by realizing that the calculation of each Mandelbrot Fractal point (happening in a loop) is independent of all other points, and thus I could distribute and process in separate threads. Of course, I don't want more than 4 threads (or 8 hyperthreads), which depends on the number of CPU cores (I have 4) to avoid thread competition for CPUs slowing down the calculation. As such, I relied on a Thread Pool constrained by as many processors as available. See below how simple the code to achieve that is with Ruby and the concurrent-ruby gem. Otherwise, the Glimmer DSL for SWT GUI simply paints an image as a form of image buffering (to avoid Mandelbrot pixel repaints on GUI repaints) and then puts it inside a canvas to display.

Happy Glimmering!

You may learn more about how the Mandelbrot Fractal sample got a progress bar and menus in this following blog post.

No comments: