Search code examples
c#graphicsfractals

Simple Mandelbrot renderer runs out of memory


Ive been trying to make an simple mandelbrot renderer just to get myself into c# and forms, but when i render the image the program runs out of memory sometimes.

The memory builds up to 2GB and then crashes.

But sometimes it builds up i a jigsaw pattern like this and dont crash: http://puu.sh/l2ri9/2fcd47e6d7.png

==============Code to render================

Renderer.CreateGraphics().Clear(Color.White);

        double minR = System.Convert.ToDouble(MinR.Value);
        double maxR = System.Convert.ToDouble(MaxR.Value);
        double minI = System.Convert.ToDouble(MaxI.Value);
        double maxI = System.Convert.ToDouble(MinI.Value);
        int maxN = System.Convert.ToInt32(Iterations.Value);

        SolidBrush MandelColor = new SolidBrush(Color.Red);

        for (int y = 0; y < Renderer.Height; y++)
        {
            for (int x = 0; x < Renderer.Width; x++)
            {

                double cr = fitInRRange(x, Renderer.Width, minR, maxR);
                double ci = fitInIRange(y, Renderer.Height, minI, maxI);

                int n = findMandelbrot(cr, ci, maxN);

                double t = ((n + 0.0) / (maxN + 0.0));

                MandelColor.Color = Color.FromArgb(System.Convert.ToInt32(9 * (1 - t) * t * t * t * 255), System.Convert.ToInt32(15 * (1 - t) * (1 - t) * t * t * 255), System.Convert.ToInt32(8.5 * (1 - t) * (1 - t) * (1 - t) * t * 255));

                Renderer.CreateGraphics().FillRectangle(MandelColor, x, y, 1, 1);

            }
        }

===Link To Github page=== https://github.com/JimAlexBerger/MandelbrotProject


Solution

  • Why not move Renderer.CreateGraphics() outside of the loop? The memory leak is probably caused by redundantly calling Renderer.CreateGraphics() without calling IDisposable.Dispose() on the Graphics object.

    double minR = System.Convert.ToDouble(MinR.Value);
    double maxR = System.Convert.ToDouble(MaxR.Value);
    double minI = System.Convert.ToDouble(MaxI.Value);
    double maxI = System.Convert.ToDouble(MinI.Value);
    int maxN = System.Convert.ToInt32(Iterations.Value);
    
    SolidBrush MandelColor = new SolidBrush(Color.Red);
    
    using(var graphics = Renderer.CreateGraphics())
    {
      graphics.Clear(Color.White);
    
      for (int y = 0; y < Renderer.Height; y++)
      {
          for (int x = 0; x < Renderer.Width; x++)
          {
    
              double cr = fitInRRange(x, Renderer.Width, minR, maxR);
              double ci = fitInIRange(y, Renderer.Height, minI, maxI);
    
              int n = findMandelbrot(cr, ci, maxN);
    
              double t = ((n + 0.0) / (maxN + 0.0));
    
              MandelColor.Color = Color.FromArgb(System.Convert.ToInt32(9 * (1 - t) * t * t * t * 255), System.Convert.ToInt32(15 * (1 - t) * (1 - t) * t * t * 255), System.Convert.ToInt32(8.5 * (1 - t) * (1 - t) * (1 - t) * t * 255));
    
              gfx.FillRectangle(MandelColor, x, y, 1, 1);
    
          }
      }
    }