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
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TypeOverride« (04.08.2015, 09:55)
An "Out of sync" wirst du im gewissen Maße nicht vorbeikommen. Zwischen "Client bekommt aktuelle Daten vom Server" und "Aktion vom Client kommt am Server an" können sich die Daten auf dem Server bereits wieder geändert haben und die Aktion ist ungültig. Deswegen gibt es bei Datenbanken Transaktionen, die zurückgerollt werden wenn sich der Datenstand zwischendurch so ändert das eine Aktion invalid wird.
Meiner Meinung nach ist das Ablehnen einer Aktion aber für den Spieler sehr unschön. Die Aktion einfach durchführen hingegen kann zu Inkonsistenzen führen, z.B. wenn zwei Spieler gleichzeitig die letzten Einheiten einer Ware kaufen. Ich würde daher wohl den Weg wählen solche Situationen zu sperren, indem z.B. nicht mehrere Spieler beim gleichen Händler sein können etc.
Ansonsten sehe ich eigentlich nur Übertragung blockierend im Thread oder asynchron als Möglichkeit. Das du den Render Thread nicht blockieren willst, hast du ja selbst schon erkannt.
Wenn ich meinen Senf dazu geben darf:
1. bitte Bitte BITTE kein peer2peer (sag es nur, weil es hier in den Raum geworfen wurde. Der zuerst genannte Server-Client vermeidet viele konzeptionelle Probleme).
2. Von Blocking würde ich absehen, weil sobald ein Client die Verbindung verliert, steht alles still.
3. Persönlich habe ich zum Empfangen sehr gute Erfahrungen mit eigener Thread+select+packet queue/events gemacht.
4. OoS lässt sich zwar vermeiden (siehe heartbeat concept), aber es kommt zu einem Preis. Alternativ kann man auch einfach sie in Kauf nehmen. Vorallem wenn man statt Aktionen immer nur die geänderten Zustände verschickt.
Hello_Kitty!
unregistriert
Vorweg, ich habe eine abgeschlossene Ausbildung als Fachinformatiker und bin mit den grundlegenden Dingen der Netzwerktechnik vertraut.
Vorweg, ich habe eine abgeschlossene Ausbildung als Fachinformatiker und bin mit den grundlegenden Dingen der Netzwerktechnik vertraut.
Du musst die Daten zu einem Packet schnüren und dann über OSI 0 (bit abstraction layer) an die ip_addr des Empfängers schicken.
Hoffentlich hilft dir das weiter...
mfg
Werbeanzeige