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
Namenloser

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

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 17: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
 
#2

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 17: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
 
#3

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 18: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
 
#4

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 18: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.
Angehängte Grafiken
Dateityp: jpg mandelbrot.jpg (62,3 KB, 25x aufgerufen)
  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
 
#5

AW: Mandelbrot-Menge optimieren

  Alt 1. Okt 2012, 15:12
Mein Versuch die Auswirkung von Threads bei bestimmten Randbedingungen zu untersuchen ...
Angehängte Grafiken
Dateityp: png MB_0.png (157,1 KB, 19x aufgerufen)
Dateityp: jpg MB_1.jpg (128,2 KB, 23x aufgerufen)
Dateityp: png MB_03.png (42,9 KB, 20x aufgerufen)
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 18: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
 
#6

AW: Mandelbrot-Menge optimieren

  Alt 1. Okt 2012, 15: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
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: Mandelbrot-Menge optimieren

  Alt 1. Okt 2012, 16:32
Was Delphi-Laie da so unsympathisch beschreibt, ist der erste Schritt zu einem Quad-Tree. Dieser erste Schritt kann, bei passend feiner Unterteilung und etwas Glück, relativ artefaktfrei sein - kann aber auch hässlich werden. Praktisch alle Verfahren, die die Iteration von Zwischenpixeln auslassen, haben mit Artefakten zu kämpfen. Manche weniger auffällig, andere sind ganz gut kaschierbar, aber es bleibt ein Behelf. Auch ein Quad-Tree ist hier noch als Krücke anzusehen, da man für die "Ich muss weiter unterteilen"-Bedingung ja doch wieder eine Auswahl an Punkten in den Quadraten durchitereiren muss - und an dieser Auswahl hängt dann, ob man es nicht doch hier und da zu grob getrieben hat.

Iterativ machen, Verwendung von Scanline (das vor allen Dingen! .Pixels[] macht vieeeeel zunichte!) und Multithreading sollte schon einen mächtigen boost geben. Man kann zwar relativ gefahrfrei Scanlines des selben Bitmaps in mehreren Threads beschreiben (so lange man sich immer strikt die Zeilen getrennt hält), aber ich würde hier auch zu einem Array als Zwischen-Puffer tendieren. Eben schon allein für die Möglichkeiten der variablen Farbgebung ohne Neuberechnung.

Und WENN man schon multithreaded, warum nicht gleich ganz freaky werden? Das ganze ist ein Paradeeinsatz für Bei Google suchenGPGPU. Jeder Pixel wird unabhängig von allen anderen berechnet, also hat man eine wunderbare und feine Granularität des Problems. Anfangs die ganzen Bildkoordinaten in eine float/float Textur gießen, einen Shader-Kernel machen der eine Iteration macht, und das Ergebnis in eine zweite Textur schreibt. Texturen tauschen, und nochmal durch den Shader jodeln - bis zur gewünschten Iterationstiefe. Die finale Textur kann dann ähnlich des o.g. Arrays als Basis zum Farbbild dienen - auch das ließe sich als hübscher Kernel realisieren. Aber das ist eher Stufe 9,5.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz