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
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Na wenn Du meinst... Dann habe wohl entweder ich die Beiträge 14 und 17 falsch verstanden oder Du. In dem Fall dann wohl ich.Der letzte Absatz ist aber genau das, was dot schon viel früher gesagt hat.
Nö.
Überflüssig.Ich würde ein Byte mit Flags vorne ranstellen in dem es ein Bit gibt, das markiert ob die Daten gerade als Little-Endian oder Big-Endian ankommen.
Mit einer XOR verknüpfung der eigenen Byte-Order bekommt man heraus ob man ein Re-Ordering machen muss oder nicht.
Dann gibt es eben keinen XBox support. Es ist und bleibt eine Frage der Anforderungen. Es muss definiert sein, zwischen welchen Plattformen kommuniziert werden soll. Diese Festlegung macht man entweder explizit indem man dies niederschreibt, oder implizit durch die Art der Realisierung, wobei das nicht der reinen Lehre vom Requirement-Engineering entsprechen würde.
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
simbad
unregistriert
Völlig unnötig, weil es auch mit 2-3 geht (1 receive, 1-2 send dürfte ausreichen). Mehr als 10 würde ich persönlich niemals empfehlen. Bei unserem MMORPG-Server mit 2000 aktiven Spielern waren eine Hand voll Threads für die Kommunikation ausreichend. Für die Bearbeitung der Daten und der Logik hatten wir aber einen Threadpool. Wie viel da drin waren, weiß ich nicht mehr, aber da wir 16 Kerne hatten, waren's vermutlich 10-14.
Quellcode |
|
1 2 3 4 5 6 7 8 |
solange server online: wenn aktivität auf listener socket: nimm neuen client an für jeden worker socket: solange aktivität: lies event gib event an in-queue delay |
Quellcode |
|
1 2 3 4 5 6 7 |
solange server online: nimm event von out-queue solange event leer: delay nimm event von out-queue ermittle ziel des events (worker) sende event an worker |
Du kannst auf die sockets warten.
Unter Linux mit select, poll oder epoll. Und Windows mit WaitForMultipleEvent und sicherlich auch mit einer fortschrittlicheren Methode.
Fürs Senden kannst du eine queue nehmen. Da wartet der Sende-Thread drauf. Immer wenn jemand was zum senden in die Queue stellt wird ein event ausgelöst. Der Thread wartet auf dieses Queue event, versucht dann alles zu verschicken, was in der queue steht. Das senden würde ich eventuell non-blocking machen. Wenn die Socket aus welchen Gründen auch immer keine Daten mehr zum senden entgegen nehmen kann gibts einen Fehlerocde. WOULDBLOCK oder so ähnlich.
Wenn die Socket wieder daten senden kann, gibt es ein entsprechendes Event das anzeigt das es weitergeht.
Diese Information, das du Datensenden kannst ist beim aufbau der Verbindung abzuwarten. Nach erfolgreichem Connect muss erst abgewartet werden, bis das Write-Event kommt. Ansonsten passiert da nix.
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
solange client online // senden bis nichts mehr zu senden solange trve: nimm event von out-queue wenn event leer: break sende event an server // empfangen bis nichts mehr zu empfangen solange aktivität auf socket: empfange event gib event an in-queue delay |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Glocke« (21.03.2013, 09:20)
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Ein select() ist hier sicherlich die bessere Lösung als non-blocking Polling.
simbad
unregistriert
SDLNet_CheckSockets
ist dürfte auf select o.ä aufbauen. Du wartest da einfach ewig. Wenn die Funktion zurückkehrt ist was passiert.
Um was für eine Art Spiel geht es und wieviele Clients soll der Server unterstützen?
Werbeanzeige