Ich arbeite an einem Autorennspiel und habe gerade ein Ghost Sprite implementiert, um vergangene Rennen wiederzugeben. Ich benutze eine Physik-Engine und bin nach langem Lesen zu dem Schluss gekommen, dass der beste Weg, die Geisterdaten für die Wiedergabe zu speichern, darin besteht, die Position und Drehung des Autos zu bestimmten Zeitpunkten aufzuzeichnen, wie hier beispielsweise beschrieben: https: // gamedev. stackexchange.com/a/8380/26261 .
Aber was wäre ein guter Weg, um diese Zeitpunkte während der Wiedergabe zu finden? Ein Beispiel wäre ein Datensatz mit diesen Daten:
time: +3.19932 (seconds since race start)
position: 180,40 (position at that time)
rotation: 30.4 (rotation at that time)
Aber ich habe einige Probleme damit:
Wenn ich wiederhole, ist es unwahrscheinlich, dass ich den genauen Zeitpunkt um 3.19932 wieder erreiche. Wahrscheinlicher ist, dass ich einen Zeitpunkt um 3.1 habe und den am besten passenden Datensatz finden muss. Bei der Interpolation auch die engste Übereinstimmung oben und unten. Das klingt sehr ineffizient und zeitaufwändig?
In welcher Listenstruktur könnte ich diese Datensätze für eine spätere Wiedergabe speichern? Eine Anordnung? Bedeutet das nicht, dass die Suchzeit für Datensätze, die einer bestimmten Zeit entsprechen, umso länger wird, je länger das Rennen dauert?
Welche Frequenz soll ich für Zeitpunkte verwenden? Jeder Frame wäre - ich denke - übertrieben, eher sollte ich dh jeden n-ten Frame speichern und dazwischen interpolieren, was die Speicherfragen in 2. noch schwieriger macht.
Ist diese Idee überhaupt der richtige Ansatz? Wenn ja, wie kann ich die Daten effizient speichern und abrufen? Bitte beachten Sie, dass ich im Allgemeinen die obige Datenstruktur verwenden möchte, nicht deterministische Spielzustände und Benutzereingaben usw. aufzeichnen möchte.
Vielen Dank für jede Hilfe!
EDIT: Mir ist klar, dass ich die Umgebung beschreiben sollte, die ich benutze: Cocos2D für iPhone. Es gibt eine Methode update:(ccTime)delta
. Idealerweise wird diese Methode alle 1/60 Sekunden aufgerufen, es gibt jedoch keine Garantie - delta
ist die tatsächliche Zeit, die seit dem letzten Gametick vergangen ist, und kann viel mehr oder weniger als 1/60 betragen. Bei dieser Methode möchte ich den aktuellen Spielstatus speichern.