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

1

07.07.2015, 18:09

[Unity3D Netzwerk] Input senden - Ist da eine "perfekte" Client Side Prediction möglich?

Hallo, es ist schon ne Weile her, wo mir bei dem Thema geholfen wurde. Seit dem habe ich viele Erfahrung sammeln können.

Ich habe nun folgendes Problem. Es geht um das Unity 3D Engine. Und ich habe da mehrere kleine Multiplayertests schon gemacht. Ich habe auch einen Client-Side-Prediction erfolgreich implementieren können. Dabei war aber das Spiel so aufgebaut:
Player A sendet seine Position und zusätzlich seine Geschwindigkeit, wenn er sich bewegt. Player B nimmt die Daten auf und wendet es bei seinen RemotePlayer A an. Zusätzlich werden die Latenzen beachtet und die Geschwindigkeit und Position quasi eingeschätzt wo der Charakter mittlerweile sein könnte und wird dahin bewegt, falls die eingeschätzte Position zu sehr von der neuen Position ausweicht.

Nun, aber wollte ich anders vorgehen, damit ich so wenig wie möglich sende.
Bei dem jetzigen Multiplayer habe ich so gemacht, dass man über das Netzwerk nur die Inputs für W-S und A-D sendet. Ich sende dabei -1, 0, 1.
Die anderen empfangen es und bewegen dann ihren Charakter durch das Netzwerk kommende Daten. Jetzt wollte ich dazu Client-Side-Prediction machen, aber folgendes Problem habe ich dabei:

  1. Sagen wir Player A drückt W und es wird 1 gesendet.
  2. Player A bewegt sich schon wobei Player B auch bereits bekommen hat, da er guten Ping hat und auf den RemotePlayer A "Script" wird logischerweise auch auf 1 gesetzt und bewegt sich.
  3. Plötzlich laggt Player B
  4. Player A und und RemotePlayer A bei Player B bewegt sich noch Synchron.
  5. Player A lässt W los es wird 0 gesendet und bleibt stehen, aber Player B bekommt es später darum bewegt der RemotePlayer A sich weiter und es ist nicht mehr Synchron.
  6. Bei Player B korrigiert die Position von RemotePlayer A, da je nach Situation die Position zum Korrigieren gesendet wird. Desync wurde korrigiert.

Die Inputs kann man quasi als Velocity annehmen.

Nun es hört sich teilweise ok an, aber das Problem ist, dass es im Spiel wirklich doof anschaut, wenn der RemotePlayer vorbei läuft. Das passiert übrigens bei einem Ping von 80. Es läuft manchmal vorbei und wird zurück gesetzt.
Nun habt ihr nen Tipp für mich oder eine Alternative wie ich das lösen könnte?

Ich will irgendwann nen Autoritativen Server machen und da will ich die Position nicht senden müssen, da ja der Server sagt wo der Spieler gerade ist. Bei dem hier geht es, aber um einen Cloudserver, wo es nicht möglich ist.


Außerdem habe ich noch ne Frage. Wie sollte sich denn ein Spiel bei einem Lagg verhalten. Es gibt ja Spiele, die bewegen sich bei einem Lagg trotzdem weiter oder werden eingefroren. Gemeint ist, wenn das Spiel plötzlich sowas anzeigt "Ping Timout: 30 Seconds to disconnect". Dann ist man eingefroren. Und dann gibt es welche, da läuft man weiter und wird, aber nach dem lagg wird es zurückgesetzt. Ich frage mich was die da denn senden oder empfangen, dass es so passiert.
Nichts ist unmöglich.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

07.07.2015, 18:24

Wenn dir das Verhalten so nicht gefällt darfst du nicht extrapolieren. Aktuell tust du ja genau das. So wie ich das kenne interpolieren die meisten Spiele zur gewünschten Position. Einfach damit es flüssiger wirkt. Es hängt aber auch stark vom Spiel ab wie sich die Spieler in der Welt verhalten. Bei einem Shooter wirst du normalerweise wollen dass die Spieler möglichst korrekt und synchron auf allen Maschinen sind. Bei einem klassischen Rollenspiel mag das nicht ganz so wichtig sein. Aber wie gesagt, wenn dich das Verhalten stört dann nimm die Extrapolation raus und gut.
Das mit dem Timeout ist auch so eine Sache. Wie sich dein Spiel da verhalten soll musst du eben selbst wissen. Mach dir Gedanken was dir als sinnvoll erscheint. Gesendet wird da normalerweise nichts. Wenn du ein Timeout hast wie willst du dann senden und empfangen? Das erkennen normalerweise sowohl Server als auch Client und können dann passend darauf reagieren. Zum Beispiel sorgt bei Heroes of the Storm der Server dafür dass der Charakter von der KI weiter gesteuert wird bis die Verbindung wieder da ist. Der Client zeigt dann die passende Meldung an.
„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.“

3

07.07.2015, 19:24

Hey danke für die Antwort. Ja der letzte Satz war unglücklich formuliert von mir. Damit meinte ich, ob sie jetzt auch nur die Position senden oder eher die Inputs bzw beides gleichzeitig. Bei Inputs müssten ja dann weiter rennen und bei Position stehen beleiben, weil wie du schon sagtest, dass sie nichts senden oder empfangen.

Wie meinst du das mit extrapolieren? Bei dem zweiten Beispiel interpoliere ich eigentlich zu der Position bei einem Lagg. Ansonsten läuft es ja leider vorbei, da ja die neuen Eingaben später ankommen. Ist ja quasi so als würde ich im Multiplayer von meinem PC aus die Eingaben zu anderen PCs senden und sie da anwenden lassen. Falls man das so nennt, habe ich was dazu gelernt.

Wahrscheinlich hast du recht. Muss wohl auch wie du sagst machen.
Also ich kann ja mal die Senderate von der Position erhöhen und gucken wie das so aussieht. Ich wollte einfach von technischen her gucken, wie weit ich komme. Es gibt ja Photon Cloudserver von ExitGames. Die erlauben maximal 500 Messages per Room. Und habe es ausgerechnet. Bei 7 Spielern kommt es auf 490. Und 7 Spieler sind zu wenig. Und wollte daher es so niedrig wie möglich halten und es funktioniert bei Inputs abfragen auch wunderbar, da man ja nicht immer senden braucht sondern nur beim Ändern. Bei der Position aber sendest du in der Sekunde mehrmals, da man ja die RemoteCharaktere von Position zu Position bewegt. Da kommt leider auf die 490

Also das Multiplayerspiel sieht er wie ne Third-Person aus. Ist aber nur ein Test - Techdemo. Es geht nur um Multiplayertests.
Aber einen ernsthaften Multiplayerspiel möchte ich bald machen. Da geht es um MarioKart-Style Game für Smartphones. Also total unrealistisch Race Game :D. Und ich schätze, da reichen die Position alleine nicht und muss viel mehr schicken, aber ich habe halt gehofft, dass ich niedrig wie möglich halten kann.

Ich programmiere derzeit einen Masterserver (wo die Spieler sich treffen, chatten können) + eigenen CloudGameserver (wo sie spielen :vain:) Bin zwar weit gekommen, aber ist nicht leicht. Und falls ich doch nicht schaffen sollte, dann möchte ich Photon PUN von Cloudserver benutzen wo ich das mit Message Problem haben könnte. Brauche sowas wegen der Auto-Matchmaking. :ninja:
Nichts ist unmöglich.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

07.07.2015, 20:19

Ah ich hatte da was durcheinander geworfen. Du schreibst oben dass du gewisse Werte abschätzt und den Spieler dann vorträglich bewegst. Das ist die Extrapolation. Wobei du bei deinem Inputsystem im Prinzip auch Extrapolierst. Du berechnest ja im Prinzip eine Position in der Zukunft ohne wirklich sicher zu sein dass der Spieler überhaupt noch so weit gehen möchte. Meiner Meinung nach kannst du das Problem nur lösen wenn du dein Konzept überarbeitest. Vielleicht hilft es dir ja wenn du dir anguckst wie es bei anderen Spielen gelöst wird. Zu Quake 2 gibt es da einige Informationen im Internet. Auf die schnelle habe ich da das hier gefunden. Zur Source Engine gab es auch ein paar Seiten die deren System erklären.
„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.“

5

08.07.2015, 16:41

Danke dir. Werde das mal tun :thumbup:
Nichts ist unmöglich.

Werbeanzeige