Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Man nehme OpenMP oder die PPL, dann geht das wie von selbst.
Entsprechende Frameworks wie Boost sollten da auch etwas parat haben, da kenne ich mich aber nicht aus.
@BlueCobold:
Eine dynamische Lastverteilung lässt sich ganz einfach über eine atomare Variable realisieren (Stichwort: std::atomic_int).
In dieser Variable steht immer drin, welches Pixel (oder welche Kachel, wenn man mehrere Pixel zusammenfasst) als nächstes zu rendern ist.
Immer wenn ein Thread neue Arbeit braucht, liest und erhöht er atomar diese Variable und weiß dann, was er zu tun hat.
Vom Programmieraufwand her ist das nicht schwieriger als das, was du vorschlägst, aber die Last wird besser verteilt.
Theoretisch würde ich eigentlich vorschlagen lieber 16x16 Blöcke o.ä. einzuteilen, aber mal gucken wie sich das vom Aufwand her verhält.
Einmal beim Start das zu renderende Bild in 4 (oder mehr, je nach Threads auf der CPU) einzuteilen und damit loszurechnen würde ich eigentlich nicht empfehlen. Es ist zwar etwas etwas einfacher umzusetzen als eine dynamischere Verteilung, kann aber nahezu beliebig schief gehen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"
Threads starten verursacht einiges an Overhead.
Wenn man Multithreading für bessere Performance verwendet dann will man das vermutlich vermeiden.
Hat meine eine "Menge von Threads" holt man sich eine Menge an Schreibarbeit das zu verwalten und die Chance auf Deadlocks.
Ist man mit Multithreading nicht vertraut ist das ne harte Nuss.
Ein sehr eleganter Lösungsansatz wurde ja bereits genannt.
Was spricht gegen OpenMP oder die PPL? Doch überhaupt nichts oder?
Nein, da spricht sicher nichts dagegen. Aber bei unabhängigen Pixeln in einem Raytracer sehe ich keine Probleme mit Schreibarbeit oder Deadlocks. Ich bin halt der Meinung eine einfache und der Situation angemessene Lösung zu verwenden.
Besonders von Leuten, die sich mit Raytracing beschäftigt haben und eventuell schon selber Erfahrungen gemacht haben, was wichtig ist und mir auch sagen können was ich als Nächstes einbauen könnte.
Zwei Richtungen hätte ich im Kopf:
Einerseits in Richtung Echtzeit, jedoch natürlich nur "schlechte" Grafik, mir persönlich würde es schon reichen mit 10 FPS eine Kugel im Raum bewegen zu können und zu wissen, dass das ohne eine 3D-Grafikbibkiothek funktioniert.
Anderseits die Renderqualität verbessern, vielleicht noch Refracting, andere Beleuchtungsarten und mehr mit Texturen. Hier ist die Renderzeit nicht so wichtig.
PS:
Wenn ihr euch über fortgeschrittene (bzw unpassende) Themen unterhalten wollt, dann bitte wo anders.
Ihr seht an meinem Code, was ich kann und dass es relativ unwahrscheinlich ist, dass ich ein super ausgeklügeltes Multithreadingsystem einbaue.
Ich weiß ihr meint es nett und wollt weiter helfen, aber so bringt mir das leider nichts.