Ich programmiere einen dedizierten Server in C # mit BeamServer2-DLLs. Zuerst wollte ich sehen können, wie sich andere Spieler auf unserer bereits erstellten Omuni-Karte bewegen. Dazu habe ich einfach Ihre Position in jedem Frame an den Server gesendet. Das hat geklappt und ich konnte mit ein paar Freunden spielen, aber die Bewegung war nicht nachlässig. Also habe ich versucht, Bewegungsglättung und Sicherheit hinzuzufügen, damit sie nicht einfach eine falsche Position an den Server senden können, ohne dass der Server sie daran hindert, die anderen Clients zu erreichen.
Was ich dann getan habe, habe ich einen MasterClient erstellt, der einen MovementController auf dem RemotePlayer hat. Wenn ein Client umziehen möchte, bewegt er sich lokal und sendet eine Nachricht an den Server mit der Anweisung, sich zu bewegen. Der Server nimmt dann seine Geschwindigkeit und sendet sie an den masterClient. Der masterClient bewegt dann den remotePlayer genauso wie der remotePlayer sich selbst. Wenn er aufhört sich zu bewegen, sendet er eine Nachricht mit seiner Position. Der Masterclient prüft dann, ob die Position, zu der er gekommen ist, so nahe ist wie die Position, die er vom Client hat, wenn dies gemäß dem Ping des Clients realistisch ist, setzt der Server ihn auf die Position des Clients.
Dies funktioniert, aber ich habe immer noch ein Verzögerungsproblem und bin mir nicht sicher, wie ich das beheben soll. Ich muss die Bewegung auf dem Client glätten, aber ich habe selbst herausgefunden, dass ich einfach (x / 2, y / 2, z / 2) zur Position lerp und ihn auf die reale Position im nächsten Frame bringen kann werde es bald wieder versuchen. Selbst wenn das hinzugefügt wird, bin ich mir nicht sicher, ob der Lagg behoben ist.
Irgendwelche anderen Techniken, Vorschläge, Fragen, ...? Danke, Diede.
quelle
Der herausfordernde Teil der Verzögerungskompensation besteht darin, dass Sie Updates von Kunden erhalten, die nicht in Ordnung sind. Der zum Zeitpunkt T gesendete Befehl eines verzögerten Clients kann sehr wohl nach einem Befehl des nicht verzögerten Clients eintreffen, der bei T + 40 ms gesendet wird. Das Anwenden der Befehle in der Reihenfolge, in der Sie sie erhalten, führt zu allerlei Gemeinheit. Um dies richtig zu machen, müssen Sie die Zeit zurückdrehen und alle seitdem ausgegebenen Befehle wiedergeben.
Es gibt keinen einfachen Weg, dies zu umgehen, aber es gibt mehrere gültige Lösungen. Eine relativ einfache finden Sie hier .
Es gibt viel Forschung auf diesem Gebiet, schauen Sie sich um!
quelle
Ich würde den Client so erstellen, als wäre er ein Spiel ohne Netzwerk. Das heißt, alles, was Sie tun, tun Sie sofort auf dem Client. Fügen Sie dann parallel dazu Ihren Netzwerkcode hinzu. Dieser Code erhält die Bewegungsdaten. Einfach wie von Koordinaten, Richtung und Geschwindigkeit. Es sendet dies nur an den Server, der validiert. Der Server sendet Ihnen ein OK oder eine neue Position.
Sie haben also Ihren gesamten Client-Code so, als ob er alleine auf der Welt wäre. Dann erhält es einfach neue Korrekturdaten vom Server oder ein OK. Wenn Sie vorwärts drücken und zehn Sekunden lang gedrückt halten, empfängt der Server nur diese einen Daten. Sie können das Senden / Empfangen von Daten jede Sekunde in Betracht ziehen, obwohl Sie nur die Vorwärts-Taste gedrückt halten, oder wenn Sie auf eine Verzögerungsspitze stoßen, werden Sie möglicherweise für immer ausgeführt.
quelle