AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mandelbrot-Menge optimieren

Ein Thema von MrMooed · begonnen am 30. Sep 2012 · letzter Beitrag vom 1. Okt 2012
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#11

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 16:48
dumme Frage, aber können die Threads gleichzeitig auf die TBitMap zeichnen ? Denn sie sollten dank ScanLine ja niemals in der selben Zeile sein

Ansonsten habe ich nachgedacht die Zeilen in Abhängigkeit von den Kernen zu erstellen, da es evtl. zu viel Aufwand ist X-kleine Threads zu erstellen als z.B. 8 die etwas mehr zu rechnen haben. Diese 8 Streifen könnten jeweils eine eigene BitMap haben, die dann im MainThread zusammengeklebt werden

Das Wurzelziehen mit SQRT() sollte man bei der Mandelbrotmenge unbedingt vermeiden, denn es kostet viel Zeit.
In der rekursiven Variante wird ja auf (A < 2) abgefragt.
Lässt man das Wurzelziehen weg, dann muss auch die Konstante quadriert werden (2*2=4):
Also ich habe gerade mal die Abbruchbedingung durch 4 ersetzt und die Wurzel entfernt - nun habe ich hübsche bunte Balken aber kein Apfelmänchen
Delphi-Quellcode:
  if (i < 100) and (A < 4)
    then begin
           nX := (X*X) - (Y*Y) + X_Ko;
           nY := 2*X*Y + Y_Ko;
           nA := nX*nX + nY*nY;
           result := rechne(X_Ko, Y_Ko, nX, nY, nA, i+1);
         end;

//Edit:
Kann die .Execute nicht auf andere Methoden zugreifen ? Schutzklassen sollten da ja keine Probleme bereiten .. aber wenn ich meine 'rechne' function in der .Execute aufrufe passiert nichts - kopiere ich die function hinein läuft es ?!

Geändert von MrMooed (30. Sep 2012 um 17:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#12

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 17:12
Also ich habe gerade mal die Abbruchbedingung durch 4 ersetzt und die Wurzel entfernt - nun habe ich hübsche bunte Balken aber kein Apfelmänchen
Dann hast du irgendwo noch einen anderen Fehler.
Was ich über das Wurzelziehen und dessen Vermeidung geschrieben habe ist richtig und ist eigentlich in jedem Code so umgesetzt.
Z.B. auf Wikipedia http://de.wikipedia.org/wiki/Mandelb...es_Bildpunktes
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#13

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 17:33
komischer weise tritt dieses Fehlverhalten nur bei der Rekursiven Variante auf
Das finde ich dann doch sehr seltsam .. kann mich da jemand aufklären was mein Denkfehler bei der Rekursion ist ?
Strange..
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#14

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 18:42
Nun wollte ich hier mal nachfragen ob evtl. jemand Tipps hat was ich an meiner Berechnung schneller machen (bzw. optimieren) kann.
Wollte? Willst du es jetzt nicht mehr?

Tue es doch einfach!

Ehe du es tust, um es abzukürzen: Ein gewaltiges Beschleunigungspotential ergibt sich dadurch, daß man (mehr oder weniger) kleine (rechteckige, am besten quadratische) Flächen gleich komplett färbt: Sind ihre 4 Eckpunkte, die man als erstes berechnet, gleichfarbig, so ist es mit großer Wahrscheinlichkeit das gesamte von ihnenn eingehüllte Viereck. Um Irrtümer anzahlig zu reduzieren, kann man ja auch rekursiv vorgehen und in größeren Vierecken kleinere auf gleiche Weise prüfen und ggf. füllen. Dagegen sind Scanline und Threads läppisch, obwohl beide natürlich auch ihre Berechtigung und Vorteile haben.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#15

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 18:47
Ehe du es tust, um es abzukürzen: Ein gewaltiges Beschleunigungspotential ergibt sich dadurch, daß man (mehr oder weniger) kleine (rechteckige, am besten quadratische) Flächen gleich komplett färbt: Sind ihre 4 Eckpunkte, die man als erstes berechnet, gleichfarbig, so ist es mit großer Wahrscheinlichkeit das gesamte von ihnenn eingehüllte Viereck. Um Irrtümer anzahlig zu reduzieren, kann man ja auch rekursiv vorgehen und in größeren Vierecken kleinere auf gleiche Weise prüfen und ggf. füllen.
Und was genau sollte daran schneller sein? Bei einem Fraktal muss sowieso der Wert für jeden Pixel einzeln berechnet werden, und die Anzahl der zu füllenden Pixel wird so auch nicht reduziert.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#16

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 18:54
Und was genau sollte daran schneller sein?
Die oft fehlenden Iterationen.

Bei einem Fraktal muss sowieso der Wert für jeden Pixel einzeln berechnet werden,
"Muss" muß gar nicht. Es gibt in vielen Flächenfraktalen, so auch dem Apfelmännchen, viele (ziemlich) einfarbige Gebiete, bei denen man mit hoher Treffsicherheit eben annehmen (neupseudodeutsch "davon ausgehen") kann, daß 4 gleichfarbige Eckpunkte ein komplett gleichfarbiges Gebiet umschließen.

Fällt nun der Groschen?

Ausgedacht habe ich mir das nicht, sondern schon vor ca. 20 Jahren (!) in einem DOS-Fraktalprgramm wahrgenommen.

und die Anzahl der zu füllenden Pixel wird so auch nicht reduziert.
Wer behauptet denn anderes?
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#17

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 19:02
Ich kann mir nur schwer vorstellen, dass dabei keine Artefakte auftreten...
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#18

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 19:13
Sind ihre 4 Eckpunkte, die man als erstes berechnet, gleichfarbig, so ist es mit großer Wahrscheinlichkeit das gesamte von ihnenn eingehüllte Viereck.
also nehme ich einfach irgendwo ein Quadrat und berechne die Eckpunkte ? Halte ich irgendwie für ziemlich spekulativ Ich habe mal in einem Bild markiert was passiert wenn man die falschen 4 Punkte erwischt (die trotzdem die selbe Farbe haben) Dann wäre nämlich der Inhalt futsch obwohl noch Fraktale vorhanden wären.
Miniaturansicht angehängter Grafiken
mandelbrot.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#19

AW: Mandelbrot-Menge optimieren

  Alt 1. Okt 2012, 16:12
Mein Versuch die Auswirkung von Threads bei bestimmten Randbedingungen zu untersuchen ...
Miniaturansicht angehängter Grafiken
mb_0.png   mb_1.jpg   mb_03.png  
Angehängte Dateien
Dateityp: zip MB_exe.zip (408,0 KB, 14x aufgerufen)
Dateityp: zip MB_Src.zip (4,5 KB, 20x aufgerufen)
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von Bummi ( 1. Okt 2012 um 19:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#20

AW: Mandelbrot-Menge optimieren

  Alt 1. Okt 2012, 16:31
Zu der Sache mit dem Bitmap und den der Aufteilung der Arbeit unter den Threads nach Scanlines:

Unabhängig davon ob man das (bzgl. Threadsicherheit) so machen kann/darf:

Ich habe dem Benutzer (aus Spaß) die Möglichkeit gegeben das Mandelbrot selbst einzufärben. Also je nachdem bei wie vielen Iterationen der Pixel "rausfliegt" diesen Pixel anders einfärben zu lassen. Wenn man in der Palette 10 Einträge hat dann bekommt ein Pixel der nach 11. Iterationen rausfliegt wieder die 1. Farbe.

Das Wechseln der Palette ist um einiges leichter und schneller wenn man nicht direkt auf ein Bitmap zeichnet sondern die Anzahl der Iterationen pro Pixel in einem 2D-Array speichert. So kann man das Mandelbrot schnell und einfach neu einfärben ohne alles neu berechnen zu müssen

Ist jetzt natürlich kein Tipp mit dem man die Performance der Berechnung steigern kann, aber falls du sowas vorhast, dann ist das Zwischenspeichern in einem Array sicher zu empfehlen

Edit: Ich hoffe mein Text ist nicht zu verwirrend geschrieben
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz