Mal ein Beitrag für unsere angedachte Netzwerkdiskussion:
Ich habe eine deterministische Physiksimulation auf Server- und Clientseite implementiert. Alle soundsoviel auf dem Server vergangenen Frames werden alle Objekte mit ihrer aktuellen Position, Orientierung, linearen und vertikalen Geschwindigkeit und Beschleunigung auf den Client übertragen. Jedesmal wenn auf Clientseite eine Aktion vom Spieler ausgeführt wird, wird diese an den Server gesendet.
Es treten verschiedene Probleme auf:
1. Obwohl ich mit festen Zeitschritten pro Frame arbeite (Zielzeit 20ms), laufen die beiden Simulationen natürlich nicht exakt gleichschnell ab. Dadurch kommt es auch in kurzen Zeiträumen zu Unterschieden im Fortschritt der Simulation, was auch bei häufigen Synchronisationen (mehr als 1 pro Sekunde) zu sichtbaren Lags führt (kleine, trotzdem sichtbare Sprünge einiger Objekte). Immerhin laufen bei einer Synchronisation pro Sekunde noch 50 Frames ab.
2. Die Änderungen auf Clientseite kommen natürlich nicht im selben Frame auf dem Server an, in dem sie beim Client abgesendet wurden, was sehr schnell zu großen (nicht akzeptablen) Unterschieden in der Simulation führt, was nach einer Synchronisation wieder zu unschönen Sprüngen führt.
3. Was mache ich bei großen Latenzzeiten oder Paketverlusten, wenn ein Spieler vorwärts läuft? Er geht 20 Frames lang nach vorne, beim Server kommen aber nur 10 Vorwärtsbewegungen an.
Client und Server laufen im Moment noch auf dem selben Rechner, und jetzt gibt es schon große Sprünge, wie soll das erst im echten Netzwerkbetrieb werden?
Ich habe über Clientseitige Vorhersage gelesen, da stand aber auch, dass das für größere Simulationen mit mehreren Objekten kaum anwendbar sein würde, zudem müsste ich dafür in manchen Frames die physikalische Simulation mehrfach ausführen, und ich habe schon bei einmaliger Berechnung Probleme mit hohem Aufwand.
Hat vielleicht jemand Erfahrung oder lesenswerte Tutorials, bevor ich groß drauflos probiere? Ich denke meist an Halflife2, da findet eine ähnlich komplexe Simulation statt wie bei mir, trotzdem sind Lags nicht unter einem Ping von 200 spürbar, wie wird das gemacht?