Problem mit zeitbasierender Aktualisierung, wenn die Framerate zu niedrig ist



  • Was macht man in folgender Situation:

    Es wird eine Kollisionserkennung durchgeführt, aber das sich bewegende Objekt macht sehr große Sprünge, weil die Framerate zu niedrig ist, und überspringt dadurch andere Objekte, mit denen es kollidieren sollte.



  • Könnte man da eine künstliche Bremse für die Bewegungsschritte einbauen?



  • Du könntest mehrere Stellen prüfen.



  • hmmmmmmmm schrieb:

    Könnte man da eine künstliche Bremse für die Bewegungsschritte einbauen?

    Ja, könnte man.
    Man könnte sich z.B. die Zeitdifferenz holen, und wenn sie grösser als X ist, mehrere Physik-Updates mit Dauer X machen (plus eins mit dem Rest).

    Oder man macht Physik-Updates überhaupt mit einer fixen Rate.

    Oder du machst die Physik-Updates mit unbegrenzter Zeitdifferenz, und unterteilst nur die Operationen wo es nötig/sinnvoll ist in kleinere Schritte.

    Alle drei Lösungen haben vor und Nachteile. Was die beste Variante ist, hängt von vielen Faktoren ab, die wir nicht beurteilen können, da wir dein Spiel nicht kennen.




  • Mod



  • Ich schlage vor du berechnest zuerst mit einer festen Rate. Dann Berechnest du in jedem Schritt wie weit sich das schnellste Objekt in dem jeweiligen Schritt bewegt. Wenn diese Bewegung so weit ist, das ein anderes Objekt "durchschlagen" werden könnte ohne dass eine Kollision festgestellt wird, berechnest du doppelt so viele Physikschritte usw.
    Diese vorgehensweise kann auch bei verteilten Systemen mit unterschiedlicher Rechengeschwindigkeit erfolgen. (Dann müssen die lansammen Systeme halt die Anzahl der dargestellten Bilder reduzieren um so die Rechenkapazität auf die Physikberechnung zu verlagern)


  • Mod

    MisterX schrieb:

    Dann müssen die lansammen Systeme halt die Anzahl der dargestellten Bilder reduzieren um so die Rechenkapazität auf die Physikberechnung zu verlagern

    bilder werden zu 99% von der graphikkarte gemacht, physics auf der cpu, da kann man heutzutage nicht mehr viel verlagern.



  • Das meinte ich anders:

    Verwende die komplizierteste Variante hiervon:

    http://gafferongames.com/game-physics/fix-your-timestep/

    ABER nicht mit einem festen dt sondern einem dynamischen.

    Damit meine ich, dass die Entfernungen gemessen werden die jedes Objekt in einem Zeitschritt zurücklegt. Wenn dieses zu gross ist muss das dt veringert werden (z.B halbiert). Ansonsten kann das dt vergrößert werden.

    Also eine zusätzliche Abhängigkeit von der Geschwindigkeit der Objekte einbauen.



  • MisterX schrieb:

    Ich schlage vor du berechnest zuerst mit einer festen Rate. Dann Berechnest du in jedem Schritt wie weit sich das schnellste Objekt in dem jeweiligen Schritt bewegt. Wenn diese Bewegung so weit ist, das ein anderes Objekt "durchschlagen" werden könnte ohne dass eine ...

    Und jetzt stell dir mal vor du simulierst eine Gewehrkugel mit mehreren tausend Km/h 🙂 Einfacher ist es, das Bounding Volume das für die Kollisionserkennung benutzt wird in Bewegungsrichtung zu strecken, so das es den zurückgelegten Weg ausfüllt. Das ist zwar ungenauer, aber braucht nur einen einzigen Test.



  • Cpp_Junky schrieb:

    MisterX schrieb:

    Ich schlage vor du berechnest zuerst mit einer festen Rate. Dann Berechnest du in jedem Schritt wie weit sich das schnellste Objekt in dem jeweiligen Schritt bewegt. Wenn diese Bewegung so weit ist, das ein anderes Objekt "durchschlagen" werden könnte ohne dass eine ...

    Und jetzt stell dir mal vor du simulierst eine Gewehrkugel mit mehreren tausend Km/h 🙂 Einfacher ist es, das Bounding Volume das für die Kollisionserkennung benutzt wird in Bewegungsrichtung zu strecken, so das es den zurückgelegten Weg ausfüllt. Das ist zwar ungenauer, aber braucht nur einen einzigen Test.

    Das geht ja noch... aber was ist wenn du ein Autorennen machst eins wie Trackmania. Ein Auto fährt mit 10 kmh gegen die Wand... das andere mit Beschleunigern mit 1500 kmh !?!


Anmelden zum Antworten