Ich implementiere einen Multiplayer-Asteroiden-Klon, um mehr über die Client / Server-Netzwerkarchitektur in Spielen zu erfahren. Ich habe Zeit damit verbracht, die Veröffentlichungen von GafferOnGames und Valve über deren Client / Server-Technologie zu lesen. Ich habe Probleme mit zwei Konzepten.
Derzeit besitze ich einen autoritativen Spieleserver, der mit box2d die Physik simuliert und etwa 20 Mal pro Sekunde den Status der Welt an Kunden sendet. Jeder Client verfolgt die letzten erhaltenen Snapshots und wechselt zwischen zwei Status, um die Bewegung von Sprites auszugleichen. Es ist jedoch nicht so glatt. Es kann für eine Weile glatt sein, dann ruckelt es ein bisschen, dann wieder glatt usw. Ich habe sowohl TCP als auch UDP ausprobiert, beide sind ungefähr gleich. Irgendeine Idee, was mein Problem sein könnte? (Hinweis: Ich habe dies zuerst für Einzelspieler implementiert und die Sprite-Bewegung ist mit 60 fps perfekt flüssig, wenn die Physik-Welt nur 20 Mal pro Sekunde aktualisiert wird.)
Um das erste Problem zu lösen, dachte ich, der Client sollte vielleicht auch eine Box2D-Simulation ausführen und einfach die Positionen seiner Sprites aktualisieren, damit sie mit den Server-Snapshots übereinstimmen, wenn sie nicht übereinstimmen. Ich dachte, dies könnte reibungsloser sein, da meine Single-Player-Implementierung reibungslos verläuft. Ist das eine gute Idee?
Auch wenn das oben genannte Problem nicht behoben werden kann, ist es für die clientseitige Vorhersage erforderlich? Wenn ein Spieler beispielsweise versucht, sein Schiff zu bewegen, wie kann er dann feststellen, ob er einen Asteroiden, eine Mauer oder ein feindliches Schiff ohne physikalische Simulation getroffen hat? Es scheint, als würde ihr Schiff das Objekt passieren, mit dem es kollidieren soll, bevor sie einen Schnappschuss vom Server erhalten, der besagt, dass sie das Objekt getroffen haben.
Vielen Dank!