Wenn Sie es noch nicht getan haben, empfehle ich Ihnen, diese beiden ausführlichen, aber verständlichen Artikel zu lesen: https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking und http://fabiensanglard.net/quake3/network.php .
Diese erläutern, warum das Senden von Paketen mit festem Intervall empfohlen wird. Um es kurz zu machen, es ist in der Tat hauptsächlich wichtig für Pakete, die vom Server gesendet werden.
Das Senden eines Pakets ist kostenpflichtig und die maximale Größe eines Netzwerkpakets beträgt ca. 1,5 KB. Wenn Sie also beispielsweise 16 Spieler auf Ihrem Server haben, könnte jeder Frame, wenn Sie die Bewegung für einen Spieler berechnen, mit einem naiven Code nach jeder Bewegungsauflösung ein Aktualisierungspaket an jeden Spieler senden, also 16 * 16 = 256 Pakete. Wenn Sie eine Bildrate von 30 haben, sind das 7680 Pakete.
Ein besserer Ansatz besteht darin, an jedem Frame-Anfang einen Puffer zu erstellen, darin Ihre 16 berechneten Positionsaktualisierungen zu verketten und diese dann an Ihre 16 Spieler zu senden.
Sie senden jetzt nur 480 Pakete pro Sekunde für die gleichen Ergebnisse.
Im Player-zu-Server-Fall bedeutet dies nur, dass Sie im selben Paket ein Maximum an Daten senden sollten, wie z. schaute Position, Aktionen genannt diesen Rahmen und so weiter.
Zum zweiten Teil Ihrer Frage - die Art und Weise, wie ich das Verzögerungsgefühl reduziere, bestand darin, diese Informationen in jedem Frame an den Server zu senden:
Aktuelle Position des Players (wird vom Server verwendet, um zu überprüfen, ob die Positionen auf Server- und Player-Seite nicht zu stark desynchronisiert sind).
Geschätzte Spielerposition in 1 Sekunde: Vom Kunden berechnet: Wenn der Spieler die Mausrichtung nicht ändert und die Tastatur für 1 Sekunde in ihrem aktuellen Zustand belässt, wo wird der Spieler sein? (Wir kümmern uns nicht um Kollisionen.) Wenn sich der Spieler nicht bewegt, ist seine geschätzte Position in 1 Sekunde seine aktuelle Position.
Die Position, auf die er schaut.
Jedes Mal, wenn der Server diese Informationen empfängt, aktualisiert er die zukünftige Position und die betrachtete Position und die Spielerentität bewegt sich schließlich in Richtung ihrer zukünftigen Position.
Spieler werden nie exakt synchronisiert, aber die Eingabe erfolgt sofort (was für mich am wichtigsten ist), und ich habe vorhergesagte Positionen als genau genug für mich befunden.