Hi Niya. Just downloaded the project and took a look. Nice work, and nice code, too. This is a very cool accomplishment for VB.Net!

I'm not particularly familiar with XNA, so I may not have anything useful to share, but off the top of my head, here are some easy ways to improve performance of generic GDI+ functions. (It's entirely possible you are already doing these things, so disregard as necessary!)

- Make sure all images are forced to premultiplied alpha (PARGB). It's not always obvious if GDI+ is loading assets in ARGB or PARGB format, but maybe test to see if ARGB is being used.

- Experiment with the target graphics container settings. Things like wrap mode, compositing quality, and pixel offset mode can impact performance in unpredictable ways, and if switching to high-speed options doesn't cause any graphical issues, this can be a "free" gain.

- When caching bitmaps, look at using GdipCreateCachedBitmap specifically. (Sorry, I'm not sure of the managed names for some of these functions.) GdipCreateCachedBitmap takes a Bitmap and Graphics input, and returns a new "CachedBitmap" optimized for that specific Graphics object. This allows you to use GdipDrawCachedBitmap for a nice performance gain.

- Another alternative to cached bitmaps is to dynamically switch to GDI's AlphaBlend for rendering. I'm not sure of the easiest way to accomplish this with your current rendering model, but basically, instead of using .DrawImage, you would use .GetHdc to return a DC to the graphics container. Then use GDI's AlphaBlend (which is hardware-accelerated) to perform the draw, and of course .ReleaseHdc when you are done. You lose the benefit of sub-pixel positioning (because AlphaBlend takes integer inputs) but GDI's AlphaBlend is several times faster than GDI+'s DrawImage. The problem with this approach in managed code is easily pointing a DC at the source System.Bitmap object... I'm not sure the easiest way to do that.

Those are some of the simpler ways to improve performance. It's possible XNA does some of this for you, but if not, maybe there's an easy performance bump in there...? (Apologies if you're already doing all this - I haven't looked too closely at the code yet!)