Vorstellung: Fraktalzeichner

Java_Jim

Komplett-PC-Aufrüster(in)
Hallo PCGH Forum,

ich stelle euch mein aktuelles Softwareprojekt vor, (m)einen Fraktalzeichner.
Wie der Name schon sagt zeichnet das Programmm verschiedene Fraktale auf dem Bildschirm.
Die Oberfläche habe ich mit Qt erstellt; OpenCL habe ich benutzt, um Grafikkarten zum Berechnen zu nutzen.
Ihr könnt ihn euch von Sourceforge unter dem folgenden Link runterladen:
Fractal painter | SourceForge.net

In der aktuellen Version kann man 4 verschiedene Fraktale berechnen und anzeigen lassen:

  • Julia-Menge
  • Mandelbrot-Menge
  • Brennendes-Schiff-Fraktal
  • Tricorn
Man kann mit dem Mausrad rein- und rauszoomen, leider noch nocht unendlich weit; aber ich werde das bald mit der "GNU MPFR Library" nachrüsten. (Das funktioniert dann nicht unter OpenCL, also nur mit CPU) The GNU MPFR Library

Um die Berechnung zu beschleunigen verwendet das Programm standardmäßig OpenCL, falls verfügbar - sonst wird die Berechnung auf dem Hauptprozessor ausgeführt.
Wenn man will, kann man trotz Grafikkarte mit OpenCL auf die CPU umschalten.
Auch kann man den aktuellen Ausschnitt als Bitmap speichern - das Bild liegt dann im Programmverzeichnis.

Eine deutsche Übersetzung ist mit dabei.

Wenn es euch interessiert, ladet es runter und probiert es aus.

Bug-Meldungen, Anregungen und konstruktive Kritik wären schön ;)

Update (25. Dezember 2014) - Weihnachts-Update:
-Variable Anzahl von Iterationen (Kleine Performanceverbesserung bei kleinen Zoom-Faktoren)
-Ausgabe in Log-Files umgeleitet (für Fehlersuche interessant)

MfG
Java_Jim
 
Zuletzt bearbeitet:
Eine Julia-Menge
full

Die Mandelbrot-Menge
Die ganze Mandelbrot-Menge
full


Der Teil unter dem "Kopf"
full

Das Brennende Schiff Fraktal
full

Tricorn
full
 
Zuletzt bearbeitet:
Neat! Gefällt mir sehr!
Endlich mal wieder ein tolles Projekt in diesem Forum.

Ich habe leider gerade keine Zeit mir den Code näher anzugucken, aber, dass du es mit OpenCL als Default-Variante eingebaut hast, finde ich spitze. Leidet bei dir die Berechnung unter Float Artefakten? Oder hast du auch das bedacht und schlauer gemacht, sodass man quasi endlos reinzoomen kann ohne Artefakte?

Grüße


EDIT: Hab doch mal gecloned gerade. Bei mir kompiliert das nicht auf Anhieb, weil du noch einen kleinen Fehler drin hast: openclhandler.cpp 245 muss es "const char*" heißen anstatt nur "char*", weil das sonst nicht zur hpp passt. Dann kompiliert es zwar, aber kann nicht ausgeführt werden, weil irgendwas throwed und zwar im openclhandler ctor. Den hast du ja als throw() deklariert... was irgendwie nicht so gut ist, insbesondere da du selber Methoden von dir aufrufst, die nicht als throw() deklariert sind. Im übrigen ist throw() auch ein bisschen deprecated, man sollte eher "noexcept" aus C++11 nutzen.
Abstürzen tut er jedenfalls irgendwo in OpenCLHandler::interatePlatforms() . Habe jetzt (wie gesagt) keine Zeit, da weiter reinzugucken und weiter zu debuggen, vllt fällt dir ja noch der Fehler auf. Sonst guck ich später nochmal.

EDIT2: Ok Fehler gefunden. Ich glaube du hast "throw()" falsch verstanden. "throw()" an sich, sagt nicht, wie du, wie ich vermute, denkst, dass man dem Compiler sagt, dass diese Funktion eine Exception wirft, sondern genau das Gegenteil. In den Klammern listet man nämlich alle Exceptions auf, die geworfen werden können, wie zb. "throw(std::runtime_error)". Leere Klammern heißen also, dass nie gethrowed wird. Daher kann man in deinem Code "throw()" einfach wegnehmen und es funktioniert (bei mir).
Das Problem ist, dass der Compiler optimieren darf, wenn er nicht erwartet, dass dort eine Exception geworfen wird. Und die Optimierung hat zur Folge, dass unerwartete Dinge passieren, wenn doch eine Exception geworfen wird. Also wenn ich mich richtig erinnere muss bei "throw()" noch std::terminate aufgerufen werden (was bei mir auch passiert), was aber nicht so viel Optimierungsspielraum bietet. Im neueren C++11 darf bei "noexcept" undefined behavior auftreten, was deutlich mehr Spielraum für Optimierungen bietet.

Grüße
 
Zuletzt bearbeitet:
Es freut mich, dass dir mein Programm gefällt :D
Hätte nicht gedacht, dass du dir schon den Code anschaust, sondern erst die exe.

Leider kann man (noch) nicht undendlich weit hineinzoomen.
Erstmal muss ich es optimieren; die Performance ist im Vergleich zu anderen Programmen bescheiden.

Den kleinen Fehler habe ich total übersehen :what:; ich lade die korrekte Datei heute noch hoch.
In den vergangenen Tagen habe ich 5 mal vergeblich versucht, Qt statisch zu kompilieren; erst beim 6. Versuch hat es geklappt. Deswegen habe ich das wohl nicht mehr bemerkt.


EDIT:
Das mit der Exception habe ich falsch verstanden; ich wollte tatsächlich, dass man alle Exceptions werfen kann, also habe ich das rausgenommen.

Aber ein Problem ist noch aufgetaucht, als ein Kollege das Programm in einer VM ausprobiert hat:
Der Fraktalzeichner braucht die OpenCL.dll. Ist die nicht instaliert, beendet sich das Programm mit entsprechender Fehlermeldung.
Das bedeutet aber auch, dass momentan mein CPU-Fallback wertlos ist, da das Programm eben von der OpenCL.dll abhängt.
Hat jemand vielleicht einen Tipp dazu?

MfG
Java_Jim
 
Zuletzt bearbeitet:
Puh, seit mehr als 2 Monaten endlich mal ein Update; bin wegen dem Studium nicht mehr dazugekommen.

Ich wünsche euch noch schöne Feiertage :)
 
Zurück