Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Zeichnungs-beschleunigung


McDonalds-Inder - Di 17.05.05 11:06
Titel: Zeichnungs-beschleunigung
kuckuck
hab da ma ne frage:
wie kann man bei mandelbrot in delphi das Zeichnen beschleunigen( z.B. durch Spiegeln oder so)???

danke schon mal an alle, die antworten!!!
würd uns sehr helfen


Moderiert von user profile iconraziel: Topic aus Sonstiges verschoben am Di 17.05.2005 um 12:45


patrick - Di 17.05.05 12:14

indem man einem nordwest antarktischen laubfrosch am begin einen rüssel transplantiert und am end. zwei engelsflügel :? :wink: :mrgreen:

aber im ernst:
mit den paar infos kann dir hier wohl kaum einer weiter helfen.
was hast du denn bisher gemacht? wie sieht deine bisherige zeichen-funktion aus?
was möchtest du überhaupt zeichnen? bilder, symbole, ein paar geometrische funktionen?

gruß von meinem curry-bigmac


Der Bear - Di 17.05.05 12:53

Hallo, würde mich auch mal interessieren!

habe mir den alten Mandelbrot-Thread durchgelesen (http://www.delphi-forum.de/viewtopic.php?t=7588) und mich würd auch interessieren wie ich jetzt das scanline genau anwenden muss. Die Onlinehilfe ist nicht so ganz aufschlussreich, und ich arbeite auch das erste Mal mit Grafik.

Mein Programm: Ein TImage der Breite 628p, was ein pi darstellt. Mit einer TrackBar kann die gewünschte Frequenz eingestellt werden, woraufhin er das Image neu zeichnet (für jeden x-Wert den zugehörigen sinuswert = x&y des Image).
Das ganze dauert jedoch relativ lange (20Hz: ~0.45s, 100Hz: ~2.15s ), weshalb ich es gerne optimieren möchte.

Vielen Dank für comments!


Neuromancer - Di 17.05.05 16:59

@McDonalds-Insider:

Nun ja, wie du die Achse spiegelst, dürfte ja wohl kein Problem darstellen. Sobald du weißt, dass du dich in einer symmetrischen Zahlenebene befindest, kannst du davon ausgehen, dass auch der "grafische Inhalt" dieser Zahlenebene symmetrisch sein wird (zumindest beim Standard-Apfelmännchen z = z² + c).

Was deiner Anwendung allerdings einen gehörigen Boost verschaffen könnte, ist das Ausprogrammieren einer sogenannten Color-Guessing-Engine.
Die Idee dahinter ist folgende:
Am rechenintensivsten sind diejenigen Operationen innerhalb der Menge, die den Bailout nicht erreichen. Hier muss jedes mal bis zur Iterationsgrenze iteriert werden. Beim Standard-Apfelmännchen also die schwarze Menge - das eigentliche Apfelmännchen. Und genau das braucht am meisten Zeit.
Also gibt es folgende Möglichkeit, hier ein wenig cleverer vorzugehen: Berechne nicht jeden Punkt in der Ebene einzeln, sondern berechne nur die Eckpunkte eines größeren "Zahlennetzes". Gemeint sind damit die Punkte "drumherum", also um den Punkt in der Ebene, der untersucht werden soll, im Prinzip also eine kleine Matrix:


Quelltext
1:
2:
3:
P11 P12 P13
P21 P22 P23
P31 P32 P33


Anstatt jetzt den Fokus auf P22 zu setzen, dann auf P23 usw. untersuchst du die "Randgebiete" von P22. Also in diesem Fall die Punkte P11, P13, P31 und P33. Wenn alle diese Punkte dieselbe Farbe haben (also nach genau derselben Iterationstiefe den Bailout erreichen), dann kannst du davon ausgehen, dass auch P12, P21, P22, P23 und P32 dieselbe Farbe haben werden. Wenn nicht, dann musst du die Punkte innerhalb der Matrix alle einzeln berechnen.

Die Farben werden hier also nicht alle berechnet, sondern teilweise "erraten".

Natürlich ist es möglich, dass die resultierende Grafik leichte Fehler enthält. Allerdings bringt diese Methode auch einen gehörigen Performance-Boost.

Ich habe mit dieser Hilfe einmal einen Echtzeit-Zoom in ein Apfelmännchen realisiert, der mit knappen 25 fps doch schon recht flüssig lief. Allerdings musste ich es in Assembler realisieren. Mit Delphi (besser gesagt Turbo-Pascal) war da nichts mehr zu machen... ;-)

Gruß