

A random suggestion would be to draw to multiple canvases, and use a CSS animation for the delay.
Also not sure if you are already doing this but it might be more peformant to use the raw buffer instead of draw functions.
Alternatively you could look into webgpu, it is ment for these kind of things.
All the calculations could be done before hand and stored and then the only thing left in the delayed draw is to set the buffer.
I haven’t looked at the code yet so not sure how much if any it will save though.
Could also group pixels that are far away from eachother into a single call, while a compromise i think it will maintain the effect.