简单的 Mandelbrot 渲染器内存不足

Simple Mandelbrot renderer runs out of memory

我一直在尝试制作一个简单的 mandelbrot 渲染器,只是为了让自己进入 c# 和表单,但是当我渲染图像时,程序有时会耗尽内存。

内存增加到 2GB 然后崩溃。

但有时它会像这样构建一个拼图模式并且不会崩溃: http://puu.sh/l2ri9/2fcd47e6d7.png

==============渲染代码================

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到Github页=== https://github.com/JimAlexBerger/MandelbrotProject

为什么不将 Renderer.CreateGraphics() 移出循环?内存泄漏可能是由于在 Graphics 对象上没有调用 IDisposable.Dispose() 而冗余调用 Renderer.CreateGraphics() 引起的。

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);

      }
  }
}