Optimized Joe Stegman’s Dynamic Image Generation (Twice the Speed)


I needed a good and relatively fast dynamic image generation code for Silverlight (for the next sample, you’ll see).


Joe Stegman has an excellent post including source code for generating images in Silverlight: http://blogs.msdn.com/jstegman/archive/2008/04/21/dynamic-image-generation-in-silverlight.aspx


Joe’s code is simple and easy to understand, but can be optimized for speed quite a bit.


After doing some profiling (looking in Task Manager) and optimizations, I managed to speed up the code more than twice. To find out the slowest functions, I just ran and image generation in a loop and looked at the CPU usage in Task Manager when disabling each of the functions.


These are the things I updated:


·         All the image data is not copied anymore in the WriteChunk() function


·         One big array was initialized on every frame in Encode()


·         Changed SetPixel() to remove some checks in Release mode


·         The Adler32 algorithm was amazingly slow (it’s doing two prime number divisions for each pixel)…after looking at Wikipedia I found a trick that makes the adler use 5550 times less divisions J


The optimized source is here: http://blogs.msdn.com/nikola/attachment/8690157.ashx


Further optimizations


There can be more optimizations, for example the PngEncoder always works with the same image width/height, so it may avoid some calls to write to a memory stream and bulk several calls into one.


The second memory stream in Encode() can be removed.


Maybe the image can be stored png-encoded and just updated by SetPixel. This way the stream creation will be very fast. This will be good if for example only 10% of the pixels are changed each frame.


I hope someone else will pick up the source finish what we started J (or I’ll finish it later)


Note: this is a remake of a post that was accidentally deleted.

EditableImage.zip

Comments (0)

Skip to main content