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

simsusim

Frischling

  • »simsusim« ist der Autor dieses Themas

Beiträge: 18

Wohnort: In einem kleinen Städtchen in Bayern

Beruf: Schüler(Gymnasium) 9. Klasse

  • Private Nachricht senden

1

04.12.2013, 07:16

Multicore Programmierung

Hi :D
Ich bin auf der suche nach einer vernünftigen lösung für die Multicoreprogrammierung bei Games. In der theorie ist das ja ganz einfach: Programm in mehrere Threads aufteilen und jeder Kern bekommt einen thread. Aber wo kann man da bei einem spiel ansetzen? Ich stelle mir das ungefähr so vor, dass ich einen leit-Thread habe, der BeginScene() aufruft und dann jedem thread gleich viele Objekte zuweist, die er rendern soll. Wenn die Threads fertig sind mit dem Aufruf von Render() geben sie das an den leit-Thread zurück und dieser ruft EndScene() auf und erledigt alles weitere.
Funk tioniert das überhaupt so wie ich mir das vorstelle? Oder gibt es andere bessere Methoden?

Bin gespannt auf eure Vorschläge :D

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

04.12.2013, 07:57

Nein, das geht so nicht. Die meisten 3D-APIs sind nicht aus mehreren Threads bedienbar. Es gibt mit DX11 Command Buffer, bei denen Du jeweils eine Serie Aufrufe in einem separaten Thread akkumulieren kannst, aber ausgeführt werden muss der Buffer dann trotzdem auf dem Hauptthread. Alle anderen APIs dagegen würden am ehesten einfach crashen, wenn Du sie aus mehreren Threads parallel aufrufst.

Zumal OpenGL und in eingem Maße auch DirectX interne Zustände haben wie z.B. gebundene RenderStates, Buffer, Texturen usw., die das Ergebnis bestimmen. Wenn Du aus mehreren Threads heraus Shader, Konstanten, Buffer usw. zuweist, überschreibst Du damit nur den globalen Zustand im Treiber und bekommst prinzipiell nicht das Ergebnis, was Du eigentlich rendern wolltest.
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.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

04.12.2013, 09:20

Zum Thema Multithreaded Rendering:
http://www.tomshardware.de/DirectX-OpenG…e-240159-6.html
http://msdn.microsoft.com/de-de/library/…1(v=vs.85).aspx

Mehrere CPU-Kerne auszunutzen kann aber natürlich weiter gehen als nur das Rendering zu parallelisieren.
Insbesondere die Physiksimulation eignet sich sehr gut dafür, parallel zur restlichen Spiellogik und zum Rendering ausgeführt zu werden.
Theoretisch ist es auch möglich, die Spielobjekte parallel zu aktualisieren. Ist aber nicht einfach, vor allem, wenn die miteinander interagieren sollen (Schrompf hat das schonmal erläutert anhand seines Spiels Splatter).

simsusim

Frischling

  • »simsusim« ist der Autor dieses Themas

Beiträge: 18

Wohnort: In einem kleinen Städtchen in Bayern

Beruf: Schüler(Gymnasium) 9. Klasse

  • Private Nachricht senden

4

04.12.2013, 10:20

Danke für die schbelle Antwort :D
Genaus wie ich vermutet habe, geht wohl doch nicht so einfach :D
Ich werde mich erstmal hinsetzen und meine engine von DirectX 9 auf DirectX11 umschreiben (jetzt hab ich wenigstens nen handfesten Grund mir die Arbeit zu machen :D ).

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

5

09.12.2013, 20:31

Relativ einfach kann es sein, verschiedene CPU Kerne verschiedene Aufgaben zuzuweisen. Rendering, Sound, Netzwerk, Physik, usw. wären solche Aufgaben. Allerdings bekommt man damit allein selten eine gute Ausnutzung aller Kerne hin. Besonders Rendering und Physik sind sehr aufwendig, wären 2D-Soundberechnung für eine Stereoausgabe bei "normaler" Qualität heute von ner CPU eher nebenbei gemacht wird. 3D Sound kann dagegen wieder auch fast beliebt aufwendig werden.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

simsusim

Frischling

  • »simsusim« ist der Autor dieses Themas

Beiträge: 18

Wohnort: In einem kleinen Städtchen in Bayern

Beruf: Schüler(Gymnasium) 9. Klasse

  • Private Nachricht senden

6

14.12.2013, 14:28

Klar, sound, physik... in einzelne threads zu packen ist nicht alt zu schwer, aber das größte problem ist ja das rendern und das bekommen ich mit dx9 nunmal nicht hin :D

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

7

14.12.2013, 14:34

Doch, klar. Miss erstmal nach, wieviel Zeit Du wirklich wofür in Deiner Renderloop brauchst. Es geht nämlich neben den eigentlichen Direct3D-Calls auch noch ne Menge Rechenzeit für Sichtprüfungen, Aufbereitung und Sortierung drauf. Und die könnte man wirklich parallel tun.
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