Ich arbeite an einer Weltraumkampfsimulation, die sich über relativ große Gebiete erstreckt (ein Raumwürfel mit einer Seitenlänge von 20 Lichtminuten) und (meistens) realistische Physik verwendet. Eines der wichtigsten Elemente, die ich modellieren möchte, ist die Ausbreitungsgeschwindigkeit von Informationen über das Schlachtfeld - das heißt, wenn Spieler A sein Hauptlaufwerk auf einer Seite des Schlachtfelds einschaltet, gibt es eine Verzögerung von 20 Minuten, bevor Spieler B es sieht und kann darauf reagieren
Dies ist auch für relativ kleine Schlachtfelder ein wichtiger Faktor angesichts der damit verbundenen Geschwindigkeiten. Ein 500 m langes Schiff mit 30 km / s wird sich in 1/60 Sekunde um seine volle Länge verdrängen, sodass selbst das Zielen auf einen Gegner, der nur wenige Zehntelsekunden entfernt ist, von einer leichten Verzögerung betroffen ist.
Ich habe dies noch nie gesehen und frage mich, ob es einige bewährte Methoden gibt, um dies zu modellieren. Im Moment stempele ich jedes Ereignis mit einem Zeitstempel und markiere es mit einem Ort, stelle es in eine Warteschlange und prüfe dann bei jedem Häkchen, ob sich eines der Objekte in der Spielwelt am Rand des Lichtkegels befindet, und füge das Ereignis hinzu zu ihrer Sensorwarteschlange. Ich werde es (aber noch nicht) optimieren, indem ich alle Ereignisse entferne, die bereits von allen Objekten erfasst wurden, die es möglicherweise erfassen können, aber dennoch denke ich, dass dies verdammt schnell umständlich wird und viel auffrisst von Zyklen, wenn Hunderte von Abtastobjekten im Spiel sind (was ziemlich routinemäßig ist).
Gibt es Datenmodelle, die dafür besser geeignet wären, die ich auschecken sollte?
quelle
Antworten:
Nur Brainstorming hier ...
Interessanterweise ist die Netzwerkverzögerung in diesem Fall Ihr Freund. Wie in Ihnen WOLLEN einige Datenpakete verzögert werden, zumindest wenn es um das Zeichnen geht. Anstelle einer Basisverzögerung, die jeder Spieler normalerweise für alle Datenpakete hat, die nur von der Netzwerkgeschwindigkeit betroffen sind, müssen Sie für jedes Ereignis eine spezifische Verzögerung für jeden Spieler basierend auf der Lichtgeschwindigkeitsverzögerung anwenden.
Normalerweise sendet der Server Aktualisierungen zur gleichen Zeit an alle Clients. Sie müssen jedoch die "Lichtverzögerung" für jedes Ereignis (basierend auf der Entfernung des Betrachters) berechnen und erst dann eine Aktualisierung senden Zeit.
Berechnen Sie also für jedes Ereignis die Zeitverzögerung zwischen dem Ereignis und jedem Spieler und stellen Sie dieses Ereignis in eine Warteschlange, damit es erst nach Ablauf der Verzögerungszeit zum Ziehen an diesen Spieler gesendet wird.
Hiermit wird die Auswirkung einer Änderung der Position oder Geschwindigkeit des Spielers nach dem Eintreten des Ereignisses nicht behoben. Sie können jedoch möglicherweise Ereignisse anpassen, die aufgrund von Spielerwechseln in die Warteschlange gestellt wurden. Ein Spieler rückt näher, das Ereignis rückt zeitlich näher. Spieler zieht weg, zieht rechtzeitig weg.
Eine Doppler-Verschiebung wäre eine interessante Sache, die in den Mix eingehen könnte, basierend auf dem Bewegungsdelta zwischen Betrachter und Ereignis.
quelle
Die Frage ist: Wie genau muss Ihr verzögertes Bild sein, damit es tatsächlich wiedergegeben wird? Wenn Sie eine 100% ige Genauigkeit anstreben, müssen Sie entweder die Aktionen oder den Status jedes Objekts auf der Karte bei jedem Tick speichern und sie, wie Sie sagen, mit einer auf der Entfernung basierenden Verzögerung wiedergeben. Wenn Sie sich nicht so sehr für die Genauigkeit interessieren, die Sie in Spielen selten benötigen, können Sie den Status in Intervallen speichern und zwischen diesen extrapolieren, wenn die Verzögerung aufholt. Sie können optimieren, indem Sie nicht identische Updates speichern.
Alternativ können Sie alle Bewegungen vektorisieren und einen Pfad für jedes Objekt zusammen mit einer Startzeit speichern, die von einem universellen Beobachter angezeigt wird. Dann können Sie einfach die erwartete Position eines Objekts für jeden Beobachter basierend auf dem Universalzeitzähler und der Ortszeit basierend auf den von ihm gespeicherten Pfadknoten berechnen. Wenn der Zeitstempel eines Pfadknotens hinter dem Lichtkegel aller relevanten Objekte liegt, verwerfen Sie ihn.
Bearbeiten: Das oben Gesagte setzt voraus, dass Sie die grundlegende Relativitätstheorie betrügen, indem Sie einen absoluten Beobachter haben (ich nehme den Spieler an). Dies würde Ihnen einige der interessanteren Aspekte der Zeitdilatation rauben, aber diese zu modellieren, wäre ein eigenes Projekt> _>
quelle