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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

51

05.11.2012, 13:15

Multithreading ist alles andere als ein triviales Thema. Ich würde dir raten, dass du dich mal gesondert und von Grund auf damit beschäftigst.

PS: Bitte gewöhn dir an, Code Tags zu benutzen. ;)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

52

05.11.2012, 17:40

Gibt speziell Bücher zu dem Thema. Habe mir auch vor kurzem ein Buch über .Net3 und Parallel Programming besorgt. http://www.amazon.de/NET-Parallel-Progra…2133533&sr=8-10 Dieses ist es. Habe bis jetzt erst grob reingeguckt, da viel anderes zu tun ist. Sieht im Prinzip aber ganz gut aus. Ich selbst habs mir geholt um mein Halbwissen mal ordentlich zu erweitern und als Nachschlagewerk.
„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.“

53

05.11.2012, 18:34

Danke für die Antworten Tipps Anregungen.

Ich beginne jetzt glaube ich einiges Grundlegend zu verstehen. Einige Multithread Test Consolenprogramme habe ich schon geschrieben.

Also wenn ich eine int Variable mit 20 Threads hochzähle, dann werden 2% der Additionen nicht durchgeführt :D
Synchronisierung muss ich mir mal angucken^^

Ich brauche eigentlich nur eine stabile Multithread klasse.

Zum Glück ist die Partikelsimulation durch immer weitere Perfektion und Leistungsoptimierung sehr "Schlank" geworden. Sind alles nur noch ein par Zeilen Code. Von der Seite ist es "einfach" geworden.

LG

EDIT: Klappt auch ohne Joinen. Komisch.
Bilder zu meinem Projekt: ParSim

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

54

05.11.2012, 19:16

Also wenn ich eine int Variable mit 20 Threads hochzähle, dann werden 2% der Additionen nicht durchgeführt :D


http://de.wikipedia.org/wiki/Race_Condition

Sobald es um Performance geht, willst du natürlich deine Daten so strukturieren, dass du möglichst niemals Synchronisieren musst oder zumindest lockfree unterwegs sein kannst. Vor allem letzeres fällt aber schon eher in den fortgeschrittenen Bereich; für den Anfang solltest du dich wohl besser mal mit Synchronisationsprimitiven wie Critical Sections, Condition Variablen etc. auseinandersetzen.

55

05.11.2012, 20:55

Hi,

Beim Multithtread Testprogramm sind mit lock() bei 8 Threads und je 10 Millionen Additionen 100% richtig. :love:

Zudem kann ich vielleicht bei der Partikelsimulation mit einer Fehlerquote von ~2% oder so leben.

Zitat

Sobald es um Performance geht, willst du natürlich deine Daten so strukturieren, dass du möglichst niemals Synchronisieren musst oder zumindest lockfree unterwegs sein kannst.
JA! Es geht um Performance :D Ich werde also seltenst Locken, nur bei der Aktualisierung der Partikel-Zeiger im Grid sehe ich noch keinen anderen Weg.

Weiß einer ob ich auch Probleme bekomme wenn mit mehreren Threads auf verschiedene Items eines Arrays zugreife?
Beispiel:

C#-Quelltext

1
Particle[] = new Particle[100]

Der erste Thread würde jetzt auf die ersten 50 Items zugreifen und dort dinge ändern, der zweite Thread die zweiten 50 Items. Natürlich gleichzeitig. Muss ich mit Fehlern rechnen?

LG
Bilder zu meinem Projekt: ParSim

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

56

05.11.2012, 21:04

Probleme gibts immer nur dann, wenn mehrere Threads potentiell gleichzeitig auf die selbe Speicherstelle zugreifen. So lang jeder Thread auf ein anderes Element deines Arrays zugreift, ist alles in Butter.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

57

05.11.2012, 21:09

Es sollte keine Probleme geben.
Wenn die verschiedenen Threads das Array an sich manipulieren können sollen, bietet sich auch so eine Datenstruktur wie zb. "SynchronizedCollection" direkt an.

58

05.11.2012, 21:21

Ich danke euch für die Antworten.

Nach gewissen "Erfolgen" mit Multithreading werde ich die Multithread klasse die ich für die Engine verwenden will mal zeigen. Vielleicht ist ja jemand so freundlich und guckt die an, wenn es so weit ist.

Wenn es alles klappt müssten 200k und mehr Partikel in Echtzeit gehen. :vain:

Ich wette vorher stelle ich weitere noob Fragen :S

LG

EDIT:
List<T> Container waren bei meinen Tests erheblich! langsamer als Arrays :/
Bilder zu meinem Projekt: ParSim

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

59

05.11.2012, 21:27

Ist auch völlig überflüssig. Teile die Arbeit so auf, dass jeder Threat etwas bearbeitet, womit die anderen nichts zu tun haben.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

60

05.11.2012, 22:20

Zitat

Ist auch völlig überflüssig. Teile die Arbeit so auf, dass jeder Threat etwas bearbeitet, womit die anderen nichts zu tun haben.
Ja genau das ist weitgehend möglich! Bei dem ganzen.

Bei der Kollisionserkennung durch ablaufen der Sektoren ist es nicht möglich.Die Partikel sind durcheinander, die Kollisionen aber symmetrisch, also mit Zugriff auf 2 Partikel in diesem Durcheinander.

Wobei eine in einzelnen Frames versagende Kollisionserkennung vielleicht akzeptabel ist. Sonst wäre lock() das kleinste Übel. :hmm:

:D ob ich so weit je komme. Mit den Threads klappt nicht wie gewollt gerade.

LG

EDIT:

Quellcode

1
private Queue<Thread> Threads;


Ist das nicht der richtige Ansatz? :grumble:
Bilder zu meinem Projekt: ParSim

Werbeanzeige