Ich habe eine Funktion, die das nächste Bild in einer Animation von verschiedenen Objekten auf der X- und Y-Achse berechnet [Ich nenne es frameRender()
] und eine Funktion, die das resultierende Bild auf die Objekte anwendet [Ich nenne das frameDisplay()
]. Die Objekte bewegen sich nicht nur von Punkt A nach B, sie bewegen sich ständig und erhalten immer neue Zielkoordinaten. Ich benutze ein setInterval()
mit einem 1000/frameRate
Intervall, aber das scheint überhaupt nicht zu funktionieren, da Browser keine genauen Timings haben.Wie kann ich eine JavaScript-Animation in allen Browsern auf allen Systemen mit derselben Geschwindigkeit wiedergeben?
Die Frage ist: Wie kann ich sicherstellen, dass die Animation eine konstante Bildrate hat und auf allen Systemen mit der gleichen Geschwindigkeit auf allen Browsern läuft? Ich habe alles ausprobiert und kann nicht einmal bei verschiedenen Browsern ein genaues Ergebnis erzielen (ich teste Firefox und Chrome, Chrome zeigt normalerweise viel schneller an).
Das Ergebnis sollte sein: Wenn es langsam spielt, sollte das Animationsintervall zunächst abnehmen und dann versuchen, einige Frames zu überspringen [durch Überspringen frameDisplay()
], wenn es das DOM langsam anzeigt, bis es richtig abgespielt wird. Wenn es schnell abgespielt wird, sollte das Animationsintervall zunehmen, sodass die Animation mit der richtigen Geschwindigkeit abgespielt wird.
Aber wie halten Sie Konsistenz in all dem, da Sie nicht immer sicher sein können, wenn die Browser langsam werden oder wenn sie schnell arbeiten. Zum Beispiel, wenn es eine riesige Spitze von Bewegungen gibt, und wir das Intervall verringern, um die Bildrate stabil zu halten, und plötzlich die meisten sich bewegenden Objekte stoppen oder sich nicht viel bewegen, wird es plötzlich sehr schnell funktionieren!
Irgendwelche Ideen?
Also im Grunde meinst du ich sollte die Frame-Rendering-Mathematik ändern, um eine Delta-Variable zu enthalten, so kann ich zum Beispiel das Objekt mehr oder weniger X Y Pixel basierend auf der vergangenen Zeit übergeben? – stagas
@stagas - genau. Wenn also ein Update innerhalb von 50ms und das andere bei 450ms ist, sollte Ihre Anwendung immer noch auf der "500ms-Marke" stehen, wenn Sie verstehen, was ich meine. – Matt
Cool, versuchen Sie es sofort danke – stagas