Du bist nicht angemeldet.

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!

Werbeanzeige

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

11

12.07.2013, 12:11

So pauschal kann man einfach nicht sagen wo sich Threading lohnt und wo nicht. Arbeite dich doch einfach mal ein wenig in das Thema Multithreading ein und versuch mal ein paar kleinere Testanwendungen zu schreiben. Mach dich mit den Prinzipien einfach vertraut.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

12

12.07.2013, 12:25

Ich finde das allgemein völlig falsch angegangen. Es mag zwar interessant klingen, verschiedene Aufgaben auf verschiedene Threads zu legen. Aber in der Realität sind die Abhängigkeiten zwischen den Threads ziemlich komplex, was in den meisten Fällen die Parallelisierung mehr oder minder untauglich macht. Und gleichzeitig lohnt sich die Parallelisierung nur, wenn die parallelen Aufgaben ähnliche Arbeitslast haben.

Daher ist das z.B. schonmal Unsinn, den Input zu parallelisieren. Der kostet nur Nanosekunden an Rechenzeit. Paralleler Input kann sich lohnen, wenn die komplette Spiellogik mit einer Kette zeitlich gespreizter Eingabeereignisse klar kommt und das für sie tatsächlich einen Unterschied macht. Die Eingabelatenz senkt man damit aber nicht, und die Auswirkungen auf die Spiellogik dürften so minimal sein, dass man sich das ersparen kann.

Was sich dagegen lohnt zu parallelisieren, ist die grafische Darstellung. Ich habe ja nun schon einige Spiele geschrieben, und bisher war immer die Grafikausgabe mit mindestens 70% die Hauptlast. Da würde ich ansetzen. Die zeitlich vordere Schranke wäre die Spiellogik - solange die den internen Zustand und damit potentiell die grafik-relevanten Parameter (Position, Rotation, Optik) ändert, sollte man nicht losrendern. Die hintere Schranke wäre die GPU, die nunmal (bisher) alle Kommandos nur sequentiell annimmt. Das geht auch nicht anders, da alle 3D-APIs ja zustandsbehaftet sind und damit die Reihenfolge der Änderungen wichtig ist.

Durch DX11 Command Queues oder eine zumeist etwas höher abstrahierte eigene Queue kann man aber mehrere Scene Queries sehr gut parallelisieren und dadurch je nach Verwaltungsaufwand einiges rausholen. Das eigentliche Rendern besteht ja immer aus einem Abklappern der anzuzeigenden Objekte, evtl. Bestimmung der Sichtbarkeit, Zusammenstellung der Zeichenaufträge daraus, evtl. Sortierung der Aufträge, und dann die Ausführung. Die Ausführung muss am Ende sequentiell passieren, aber alles andere kann stressfrei parallel gemacht werden, solange alle Operationen dabei nur lesend auf die Szene zugreifen.

Allgemein würde ich unbedingt nachmessen, wo die Rechenzeit pro Frame denn so hingeht, bevor ich irgendwas parallelisiere.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

CCodex

Frischling

Beiträge: 19

Beruf: Elektroniker Fachrichtung Energie- und Gebäudetechnik

  • Private Nachricht senden

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

14

31.07.2013, 14:19

Mit einer gut durchgeplanten Architektur sollten sich auch Objekte parallel "updaten" lassen.
Schrompf, machst du sowas bei Splatter? Da gibt's ja schon recht viele Gegner gleichzeitig.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

15

31.07.2013, 14:30

Gute Frage, aber ich tu's nicht. Zum Einen, weil auch bei Splatter nach allem Profiling immernoch >70% der Framezeit nur für's Rendern draufgehen. Und zum Anderen, weil ich besonders gegen Ende der Entwicklung eine Menge fieser kleiner Hacks benutzt habe, um bestimmte Effekte zu erzielen. Da greifen sich bestimmte Monster gegenseitig tief in die privaten Taschen und hinterlassen kleine Marker, summieren irgendwas auf oder verschieben/rotieren das Gegenüber. Das alles in kleine autarke Operationen auszulagen, damit die Update-Schleife parallelisiert werden kann, würde einige Wochen Arbeit bedeuten.

Ich werde aber wohl noch ein paralleles Rendering einbauen. Da gehen ja vielleicht zwei Dutzend Passes pro Frame über das Level, die müssten sich mit etwas Schlauheit auch auf mehrere Cores verteilen lassen. Ich werde bei Gelegenheit berichten, ob und was es gebracht hat.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Werbeanzeige