Schnellere Methode zum zeichnen in C#
Ich versuche zum zeichnen der Mandelbrot-fraktal, verwenden Sie die folgende Methode, die ich geschrieben habe:
public void Mendelbrot(int MAX_Iterations)
{
int iterations = 0;
for (float x = -2; x <= 2; x += 0.001f)
{
for (float y = -2; y <= 2; y += 0.001f)
{
Graphics gpr = panel.CreateGraphics();
//System.Numerics
Complex C = new Complex(x, y);
Complex Z = new Complex(0, 0);
for (iterations = 0; iterations < MAX_Iterations && Complex.Abs(Z) < 2; Iterations++)
Z = Complex.Pow(Z, 2) + C;
//ARGB color based on Iterations
int r = (iterations % 32) * 7;
int g = (iterations % 16) * 14;
int b = (iterations % 128) * 2;
int a = 255;
Color c = Color.FromArgb(a,r,g,b);
Pen p = new Pen(c);
//Tranform the coordinates x(real number) and y(immaginary number)
//of the Gauss graph in x and y of the Cartesian graph
float X = (panel.Width * (x + 2)) / 4;
float Y = (panel.Height * (y + 2)) / 4;
//Draw a single pixel using a Rectangle
gpr.DrawRectangle(p, X, Y, 1, 1);
}
}
}
Es funktioniert, aber es ist langsam, weil ich muss hinzufügen der Möglichkeit zum Zoomen. Mit dieser Methode der Zeichnung, es ist nicht möglich, also muss ich schnell etwas. Ich habe versucht, eine FastBitmap, aber es ist nicht genug, die SetPixel
des FastBitmap nicht erhöhen Sie die Geschwindigkeit der Zeichnung. Also ich bin auf der Suche nach etwas sehr schnell, ich weiß, dass C# nicht wie C
und ASM
, aber es wäre interessant, dies in C#
und Winforms
.
Vorschläge sind willkommen.
EDIT: Mendelbrot Set Zoom Animation
- Das erste, was ich tun würde, ist erstellen Sie Ihre Grafik-Objekt außerhalb der Schleife.
- Die nächste Sache, wenn man es ist, etwas zu verwenden, wie XNA zu tun, die Berechnungen auf der GPU. Sechzig Fractals Pro Sekunde
- Mag die Idee. Also glaubst du kann ich die XNA Bibliotheken und dies in WinForms?
- C# ist wie C oder ASM wenn Sie das unsafe-Schlüsselwort. Google "bitmap".lockbits-Zeiger".
- Sie können die XNA-Bibliotheken, um eine WinForms-Projekt: AppHub - WinForms. In Ihrem Fall würden Sie zeichne 2 Dreiecke (um eine full-screen-quad) mit einem shader, die Sie schrieb, ähnlich wie der verlinkte in meinem vorherigen Kommentar
- Duckett Ok. Ich danke Ihnen sehr für die Anregungen!
- Nun, in diesem Fall Ihre Annahmen sind Ihr problem wahrscheinlich. Einen profiler verwenden. Schwer zu sehen, wie es geht, zu sagen, nichts anderes, aber Komplex.Pow() als Ihr echtes Nadelöhr. Es sollte zu brennen 99% der gesamten CPU-Zeit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, es wäre wesentlich effizienter, zuerst füllen Sie die RGB-Werte in ein byte-array im Speicher, dann schreiben Sie in großen Mengen in einem
Bitmap
mitLockBits
undMarshal.Copy
(Folgen Sie dem link für ein Beispiel), und endlich zeichnen Sie die bitmap mitGraphics.DrawImage
.Müssen Sie verstehen, einige grundlegende Konzepte, wie das stride-und Bild-Formate, bevor Sie diese zu arbeiten.
Als Kommentar gesagt, put out
CreateGraphics()
aus der Doppel-loop, und das ist schon eine gute imrovement.Aber auch
Zum Zoomen verwenden
MatrixTransformation
Funktionen wie:ScaleTransform
RotateTransform
TranslateTransform
Einen interessanten Artikel auf CodeProject gefunden werden kann hier. Es geht ein wenig weiter als nur die Funktion Aufrufe, indem Sie erklären, eigentlich
Matrix
Kalkül ( ein einfacher Weg, keine Sorge), das ist gut und nicht schwer zu verstehen, um zu wissen, was Los ist hinter den kulissen.