PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Funktionsweise multithreaded Game Engines


c.p.d.
2007-01-18, 01:56:00
Man liest in letzter Zeit häuffig, dass moderne Spiele auf MultiCore optimiert seien, wobei diese Spiele dann auch auf MultiCore Systemen etwas schneller laufen als auf SingleCore Systemen.

Obwohl mir gängige Threading-Konzepte durchaus bekannt sind, will mir nicht so ganz in den Kopf wie zukünftige Spiele-Engines mehrere Prozessoren sinnvoll nutzen wollen.

Im Zusammenhang mit neuen DualCore CPUs wurde viel darüber gesprochen, dass man die AI, Physik und 3D Berechnungen (und was sonst noch so anfallen könnte) in eigene Threads packen will. Und hier fange schon meine Verständnisprobleme an. Wie will man die AI und Physik parallel berechnen lassen, wenn doch die physikalischen Auswirkungen auf die Spielwelt stark von den Resultaten der AI Berechnungen abhängig sind. Auch die 3d Berechnugnen sind von AI/Physik/etc abhängig. Von parallelen Berechnungen also keine Spur. Aber irgendwie muss es ja funktionieren (sonst würden Engine-Entwickler nicht so auf MultiCore abfahren :). Sehe ich das Ganze zu fest Schwarz/Weiss?. Sind gewisse Teile der AI/Physik/3D Berechnungen sowieso voneinander unabhängig? Oder lassen sich Unabhängigkeiten zur Laufzeit mit vernünftigem Rechenaufwand bestimmen?

Des Weiteren ist mir nicht ganz klar, wie die Spiele Industrie mit der vortschreitenden CPU Entwicklung mithalten will. Angenommen wir haben 8 physikalische CPUs und 8 Engine Module, die wir auf Threads und somit CPUs verteilen können. In meinem Schönwetterszenario sind die Berechnungen der 8 Module weitgehend voneinander unabhängig. Wir hätten also (mal von gewissen Auslastungsproblemen abgesehen) unsere Berechnungen schön verteilt.
Nun wird aber die Anzahl der CPUs auf 16 verdoppelt. 16 sinvolle und unabhängige Engine Module lassen sich beim besten Willen nicht aus dem Hut zaubern und die einzelnen Module selbst lassen sich nicht weiter parallelisieren. Und schon sind wir wieder in einer Sackgassen angelangt.

Da sich gewisse Berechnungen vermutlich nur schwer (oder überhaupt nicht) parallelisieren lassen (3D auf CPU Seite?), diese möglicherweise aber sehr rechenintensiv sind, bekommen wir zu den generellen Paralleliserungs-Problemen auch noch Auslanstungsprobleme.
Was nützen 16 CPUs, wenn die 3D Berechnungen (nur ein Beispiel), im Verhältnis zu den restlichen Berechnungen, locker 5 CPUs auslasten könnten, dies aber technisch nicht realisierbar ist? Gibt es da gewisse Ansätze in Richtung micro Ops (so alla RISC). Oder sind die verschiedenen Berechnungen dafür zu unterschiedlich? Oder ist der Verwaltungsaufwand dafür zu gross?

Nun viele Fragen. Vielleicht kann mir ja jemand die einte oder andere Frage beantworten.

Monger
2007-01-18, 08:38:41
Ich bin kein Spieleentwickler (Demirug, wo steckt du? :D), aber die entscheidende Frage ist wohl, wann man Threads synchronisieren muss.


Muss z.B. die KI wirklich taktgenau auf physikalische Veränderungen reagieren, oder reicht es wenn sie es eine halbe Sekunde später tut? Müssen Partikeleffekte (z.B. eine Rauchbombe) wirklich im Moment des Ereignisses ausgelöst werden, oder kann man sich eine Fünftel Sekunde Zeit lassen?


Wenn etwas nicht hundertprozentig zeitsynchron verlaufen muss, kann man sie in unterschiedliche Threads packen, und erst später synchronisieren. Der Aufwand ist sicherlich erheblich, und zuerst einmal reduziert man die Qualität gegenüber Single Thread, weil man plötzlich keine hundertprozentige Kontrolle mehr über alle zeitlichen Abfolgen hat. Aber früher oder später wird man mit solchen Einschränkungen leben müssen, weil die Single Cores früher oder später aussterben werden.

robbitop
2007-01-18, 09:47:51
Soweit ich das verstanden habe, (Spieleentwickler wo seid ihr?) ist das aufteilen der einzelnen Aufgaben wie KI/Physik/Sound/IO/Geometrie nur die "erste Stufe" der MultiCore Programmierung in Spielen. Das wird auch für eine Weile so bleiben. Deshalb skalieren die Spiele auch nicht soo wahnsinnig mit der Anzahl der Kerne.
Später sollen die einzelnen Aufgaben auch jeweils aufgeteilt werden soweit es geht. Allerdings ist das wohl nicht so einfach und man braucht jede Menge Erfahrung mit dem Schreiben solcher Dinge. Demirug hatte da einige sehr interessante Ansätze (wobei er im Gegensatz zu den meisten Spieleentwicklern auf ein hohes Maß an Erfahrung mit Mehrkernsystemen aus dem Serverbereich zurückgreifen kann).

In 3-4 Jahren wird die Programmierung in diese Richtung sicherlich deutlich weiter sein, womit die Skalierung besser wird.

Simon
2007-01-18, 11:39:53
Hier ein sehr schöner Artikel, wie man Game Engines multithreaded entwirft: Multithreaded Game Engine Architectures (http://www.gamasutra.com/features/20060906/monkkonen_01.shtml) (kann eventuell eine kostenlose Anmeldung zum Lesen benötigen...). Da wird der Trivialfall angesprochen, dass einfach Teile der Engines (Physik, Sound, AI, etc.) in einzelne Threads ausgelagert wird und auch der Optimalfall: Datenparallelität, die beliebig nach oben skaliert =)

tokugawa
2007-01-18, 17:33:02
Jo, das mit den Subsystemen, die jeweils in einem eigenen Thread laufen ist heute schon sehr verbreitet (zumal die wichtigen Physik-Middlewares, etwa PhysX oder Havoc, alle in eigenen Thread(s) laufen).

Die Synchronisation geschieht natürlich zu einem bestimmten Zeitpunkt, aber zumindest bei PhysX hält die Physik-Engine eine eigene Szenerepräsentation (die nicht unbedingt gleich ist mit der, die die Grafik darstellt, denn für die Physik sind selten dieselben Details notwendig wie für die Grafikdarstellung).

Demirug
2007-01-18, 18:06:27
Demirug, wo steckt du? :D

Dafür sorgen dass ein nicht näher bezeichnetes Spiel mit einer nicht näher bezeichneten Engine mehrere Kerne nutzt. Details spare ich mich hier aber da ich keinen Ärger bekommen möchte.

Corrail
2007-01-18, 18:21:44
Ich hab vor einiger Zeit ein paar Ansätze mit einigen Fachleuten hier im Forum diskutiert
http://www.forum-3dcenter.org/vbulletin/showthread.php?t=204354

Chris Lux
2007-01-18, 18:53:44
Dafür sorgen dass ein nicht näher bezeichnetes Spiel mit einer nicht näher bezeichneten Engine mehrere Kerne nutzt. Details spare ich mich hier aber da ich keinen Ärger bekommen möchte.
darfst du wenigstens verraten wohin es dich verschlagen hat? ;)

Gast
2007-01-18, 18:55:49
darfst du wenigstens verraten wohin es dich verschlagen hat? ;)http://www.forum-3dcenter.org/vbulletin/showthread.php?t=338463

Chris Lux
2007-01-18, 20:11:31
danke, sehr interessant...

c.p.d.
2007-01-18, 21:23:09
Ich hab vor einiger Zeit ein paar Ansätze mit einigen Fachleuten hier im Forum diskutiert
http://www.forum-3dcenter.org/vbulletin/showthread.php?t=204354

Danke fuer den Link.