Mal ein Beispiel aus meinem Fraktalgenerator:
Zuerst das Original:
Delphi-Quellcode:
FUNCTION Formel101(a : Extended;
b : Extended;
Faktor : Extended;
Iteration : Longint;
Art : Integer ):LongInt;
VAR x,y,z : Extended;
Farbe : INTEGER;
BEGIN (* Apfelmann mit Spitze nach links *)
x := 0;
y := 0;
Farbe := 0;
REPEAT
z := x * x - y + y + 2 * a; // x² - y² + 2a
y := 2 * x * y + 3 * b; // 2 * x * y + 3b
x := z;
Farbe := Farbe + 1;
UNTIL (Farbe = Iteration) OR (x * x + y * y > Faktor);
Formel101 := GetFarbe(Farbe,x * x,y * y,x * y,Iteration,art);
END;
und dann die schnellere Methode:
Delphi-Quellcode:
FUNCTION Formel101(a : Extended;
b : Extended;
Faktor : Extended;
Iteration : Longint;
Art : Integer ):LongInt;
VAR x,y,z : Extended;
aa, bb : Extended;
xx,yy : Extended;
xy : Extended;
Farbe : INTEGER;
BEGIN (* Apfelmann mit Spitze nach links *)
x := 0;
y := 0;
Farbe := 0;
aa := a + a;
bb := b + b + b;
xx := 0;
yy := 0;
REPEAT
z := xx - yy + aa; // x² - y² + 2a
xy := x * y;
y := xy + xy + bb; // 2 * x * y + 3b
x := z;
xx := x * x;
yy := y * y;
Farbe := Farbe + 1;
UNTIL (Farbe = Iteration) OR (xx + yy > Faktor);
Formel101 := GetFarbe(Farbe,xx,yy,xy,Iteration,art);
END;
Wenn's um Rechnerei geht, kann man eigentlich recht pauschal sagen:
Alle Berechnungen, deren Ergebnis mehr als einmal benötigt wird, wird nur einmal berechnet und das Ergebnis in einer Variabel gespeichert. Danach wird statt der Berechnung die Variabel genommen.
Der Geschwindigkeitsvorteil kann dann schonmal (je nach Komplexität) um die 25% (wenn man Glück hat aber auch deutlich mehr) betragen.
Bei Grafikbearbeitung ist es hilfreich, für die Zeit der Berechnung alle Bildschirmaktuallisierungen zu deaktivieren. Ggfls. das Programm zu Beginn der Berechnung minimieren und am Ende der Berechnung wieder auf die normale Größe bringen.
Das langsamste bei der Grafikbearbeitung ist halt die Darstellung auf dem Bildschirm.