2015-10-29 3 views
0

Я пытаюсь сделать простой рендериндр mandelbrot, чтобы попасть в C# и формы, но когда я делаю изображение, у программы иногда заканчивается память.У простого рендерера Mandelbrot заканчивается память

Память накапливается до 2 ГБ, а затем падает.

Но иногда это создает ıA тектуру, как это и Dont аварии: 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); 

      } 
     } 

=== Ссылка на Github страницу === https://github.com/JimAlexBerger/MandelbrotProject

+0

Вы компилируете это как 32 или 64 бит? Если это возможно, вы должны скомпилировать это как 64-битное, это даст вам доступ к большему количеству памяти, если у вас это будет, поскольку 32-разрядный бит имеет ограничение на 4 ГБ памяти. – Jaco

+1

Do __not__ использовать 'Renderer.CreateGraphics()' в цикле. Вероятно, вы не должны использовать 'CreateGraphics' __at all__. Что такое «Renderer»? Контроль? Лучше всего рисуйте «битмап bmp» и используйте 'using (Graphics G = Graphics.FromImage (bmp)) {ваши циклы здесь!}' – TaW

ответ

0

Почему бы не двигаться Renderer.CreateGraphics() вне цикла? Потери памяти, вероятно, вызваны избыточным вызовом Renderer.CreateGraphics() без вызова IDisposable.Dispose() объекта Graphics.

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

     } 
    } 
} 
Смежные вопросы