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

18.09.2013, 11:19

Netzwerk & Pathfinding: Client-Side Prediction?

Hallo,

ich arbeite aktuell an einer netzwerkfähigen RPG-Engine (2D). Die Wegfindung funktioniert bei mir prinzipiell folgendermaßen:
  1. Der Client sendet eine Bewegungsanfrage (mit der Ziel-WorldPosition) an den Server
  2. Der Server bekommt diese Anfrage inklusive der Information, von wem sie kam. Dort wird dann geprüft, welche Spielfigur dem Client gehört.
  3. Anschließend kümmert sich das Map Model darum, dass ein Wegfindungsalgorithmus (in meinem Fall A*) ausgeführt wird. Danach bekommt das Objekt eine Liste von Wegpunkten. Diese Wegpunkte gehen an den Client raus.
  4. Der Client - der in der Zwischenzeit weiter lief - bekommt ein Update über die Wegpunkte und beginnt für die Figur mittels linearer Interpolation Zwischenpositionen zu erzeugen, an denen das Objekt dann gezeichnet wird.
  5. Parallel dazu wird auch am Server interpoliert und an jedem Wegpunkt dem Client ein Update geschickt: "Die Figur sollte jetzt an Position <x,y> stehen", welche der Client zur Korrektur verwenden kann.
Vor einiger Zeit bin ich auf das Thema Client-side prediction gestoßen. Nun frage ich mich, ob ich sowas prinzipiell "brauche" ?(
Meine Engine soll keine MMO-Engine werden - angestrebt ist etwas in Richtung Diablo 1/2. Ich habe schon überlegt, wie ich eine solche Client Prediction realisieren könnte. Der Weg der mir eingefallen ist wäre: Der Client kennt ebenso wie der Server die Kollisionsinfos und berechnet den Pfad ebenfalls. Der Server schickt weiterhin Korrekturen, um die Abweichungen vom eigentlichen (vom Server berechneten) Pfad auszugleichen.

Jetzt weiß ich nicht so recht wie ich vorgehen soll. Findet ihr ich brauche Client-Side Prediction? Oder habt ihr noch Ideen, wo ich mit meinem derzeitigen Design auf andere Probleme stoßen könnte?

LG Glocke

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

2

18.09.2013, 11:50

Selbst bei ner guten Internetverbindung kannste schon mal 40 ms einrechnen, die die Daten alleine durchs Internet brauchen. Da kommt noch die Zeit für A* auf dem Server hinzu. Und erst dann bewegt sich deine Spielerfigur los. Das klingt nach nicht viel, aber das etwas nicht "stimmt" merken Menschen schneller als man zuerst glauben mag. Daher wird sich eine solche Prediction, bei der Client selber einen Pfad berechnet und schon mal so tut, als ob die Spielerfigur loslaufen würde, sich schon bemerkbar machen. Aufpassen musst du dann aber auch auf den Server. Der sollte die Spielfigur nicht durch Korrekturen um 20ms (Zeit für den Hinweg) zurückstellen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

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

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

20.09.2013, 12:42

Client Side Prediction ist ja erst mal ein Lösungsweg für ein bestimmtes Problem. Solange das Problem nicht vorhanden ist musst du es natürlich nicht lösen. Normal sollte das aber auftauchen. Das Problem ist, dass die Aktionen auf dem Client Zeitversetzt sind. Zum Beispiel möchtest du laufen und die Spielfigur läuft erst nach einer Verzögerung los. Hier setzt jetzt Client Side Prediction an, wobei der Client ja nur voraussieht was der Server an Daten senden wird und damit schon mal arbeitet. Die Daten die dann vom Server kommen werden dann genutzt um kleine Fehler auszubessern. Zum Beispiel um Positionsdaten wieder genau anzugleichen. Du musst also gucken wie das Spielverhalten vom Client ist und dann selbst entscheiden ob du CSP brauchst.
„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.“

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

20.09.2013, 13:04

Ich denke, dass es vor allem bei Spielen relevant ist, in denen man die Figur direkt steuert (First Person Shooter, Jump and Run, ...).
Wenn man ihr nur einen Befehl à la "Gehe zu Punkt X, Y" gibt, sehe ich das nicht so kritisch.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

5

20.09.2013, 13:07

Ein Beispiel wo Client Side Prediction scheinbar eingesetzt wird und durchaus zu dem von mir beschriebenen Problem des Spielfigur zurücksetzens kommt ist Neverwinter. Wenn es da mal in der Protector's Enclave mal so richtig laggt, kannst du augenscheinlich trotzdem sofort ohne Unterbrechnung irgendwohin loslaufen. Und ein paar Momente später landet dein Character plötzlich sonstwo. :crazy:
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

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

6

20.09.2013, 13:11

Client Side Prediction ist ja erst mal ein Lösungsweg für ein bestimmtes Problem. Solange das Problem nicht vorhanden ist musst du es natürlich nicht lösen. Normal sollte das aber auftauchen. Das Problem ist, dass die Aktionen auf dem Client Zeitversetzt sind. Zum Beispiel möchtest du laufen und die Spielfigur läuft erst nach einer Verzögerung los. Hier setzt jetzt Client Side Prediction an, wobei der Client ja nur voraussieht was der Server an Daten senden wird und damit schon mal arbeitet. Die Daten die dann vom Server kommen werden dann genutzt um kleine Fehler auszubessern. Zum Beispiel um Positionsdaten wieder genau anzugleichen. Du musst also gucken wie das Spielverhalten vom Client ist und dann selbst entscheiden ob du CSP brauchst.


Also warte ich erstmal ab wie es sich entwickelt :) Pathfinding dann noch nachträglich im Client zu implementieren ist nicht das Problem, da die Arbeitsweise von Model und View (auf der Map-Ebene) ohnehin die gleiche ist.

Aber es wird ja nie so heiß gegessen wie es gekocht wird :D Abwarten und Tee trinken *Tee-Smilie-such-aber-nicht-finde*

LG Glocke

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

20.09.2013, 14:58

Kaffee ist ja auch viel leckerer als Tee;)
@Legend:
Dieses Problem kann man auch lösen. Beispielsweise kannst du jeden Befehl auf dem Client mit Zeitstempel etc speichern. Wenn der Server seine Antwort sendet überprüfst du das Ergebnis mit deinem gecachten. Ist dies unterschiedlich möchtest du das Ergebnis ja auf dem Client wieder anpassen. Nachdem du das getan hast führst du alle danach ausgeführten Befehle noch mal aus, da du diese ja gespeichert hast. Dadurch bekommt deine Figur keine großen Sprünge mehr, sondern nur noch Abweichungen in der Fehlertoleranz. Wenn ich es richtig im Kopf habe wurde das erste mal bei Quake so ein Prinzip eingesetzt. Kann aber auch sein dass ich da grad was durcheinander werfe.

edit:
Zum aktuellen Thema. Manche Spiele (League of Legends als Beispiel, zumindest früher mal) setzen eine recht einfache Version von CSP ein. Du klickst irgendwo auf die Karte und der Server bekommt eine Anfrage den Weg zu diesem Punkt zu berechnen. Der Client predictet, indem er den Charakter einfach auf gradem Weh zum ausgewählten Punkt schickt. Dadurch kann es jedoch passieren, dass der Charakter den Weg wieder zurück laufen muss wenn er Antwort vom Server bekommt. Das ist dann je nach Terrain.
„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.“

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

8

20.09.2013, 15:01

@Schorsch: Jop, klingt möglich. Aber Neverwinter ist grad ein schönes Beispiel, was passiert wenn man es nicht macht. ;)
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

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

Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

9

20.09.2013, 16:06

Ich finde es immer wieder erstaunlich auf welche Probleme man trifft wenn man sich mit einem auf den ersten Blick simplen Problem beschäftigt.

Ich bin jedenfalls schon sehr gespannt und ich hoffe du lässt am Ende ein paar Infos zu deinen Erfahrungen und Ergebnissen hier im Forum zurück.

Ich werde "Client Side Prediction" jetzt erstmal googeln :-)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

20.09.2013, 16:54

Da steckt noch viel mehr hinter ;)
Besonders interessant ist das bei Echtzeit-Multiplayer-Spielen wie Battlefield, Counterstrike etc.
Jeder Spieler kommuniziert mit einer anderen Verzögerung mit dem Server, dieser muss irgendwie alles unter einen Hut bekommen und dabei wenn möglich keinen Spieler stark benachteiligen.
Ich denke, dass das Problem prinzipiell unlösbar ist. Klassisches Beispiel: du rennst um eine Ecke, um einem Gegner zu entkommen, und wirst getroffen, als du aus deiner Sicht schon um die Ecke herum warst. Aus der Sicht des Gegners jedoch nicht. Wer hat da jetzt recht?

Werbeanzeige