Hypothèses: rAF now
le temps est calculé au moment où l'ensemble des rappels sont tous déclenchés. Par conséquent, tout blocage qui se produit avant le premier rappel de cette trame n'affecte pas le RAF now
et il est précis - au moins pour ce premier rappel.requestAnimationFrame [maintenant] vs performance.now() écart de temps
Toute mesure performance.now() effectuée avant le déclenchement d'un ensemble rAF doit être antérieure à la valeur now
.
Test: Enregistrer before
(un temps de référence avant quoi que ce soit se produit). Définir le prochain RAF. Comparez rAF now
et réel performance.now()
à before
pour voir comment ils sont différents.
Résultats attendus:
var before = performance.now(), frames = ["with blocking", "with no blocking"], calls = 0;
requestAnimationFrame(function frame(rAFnow) {
var actual = performance.now();
console.log("frame " + (calls + 1) + " " + frames[calls] + ":");
console.log("before frame -> rAF now: " + (rAFnow - before));
console.log("before frame -> rAF actual: " + (actual - before));
if (++calls < frames.length) { before = actual; requestAnimationFrame(frame); }
});
// blocking
for (var i = 0, l = 0; i < 10000000; i++) {
l += i;
}
Observations: Quand il bloque avant que la trame commence, le temps rFA now
est parfois incorrecte, même pour cette première image. Parfois, la première image now
est en réalité une heure antérieure à l'heure enregistrée before
.
Qu'il y bloque passe avant que le cadre ou non, tous si souvent le temps en cadre rAFnow
sera plus tôt que le temps de pré-cadre before
--Même quand je configuration après la Royal Air Force je prends ma première mesure . Cela peut aussi arriver sans aucun blocage, même si c'est plus rare.
(je reçois une erreur de synchronisation sur la première image de blocage la plupart du temps. Obtenir une question sur les autres est plus rare, mais ne se produit de temps en temps si vous essayez d'exécuter quelques fois.)
Avec plus vaste test, j'ai trouvé des mauvais moments avec blocage avant rappel: 1% à partir de 100 images, pas de blocage: 0.21645021645021645% à partir de ~ 400 images, apparemment causé par l'ouverture d'une fenêtre ou une autre action potentiellement gourmande en CPU par l'utilisateur.
Donc, c'est assez rare, mais le problème est que cela ne devrait pas arriver du tout. Si vous voulez faire des choses utiles avec eux, simuler le temps, l'animation, etc., alors vous avez besoin de ces moments pour avoir du sens.
J'ai pris en compte ce que les gens ont dit, mais peut-être que je ne comprends toujours pas comment les choses fonctionnent. Si tout cela est conforme à la spécification, j'adorerais un code de pseudo-code pour le consolider dans mon esprit.
Et surtout, si quelqu'un a des suggestions pour contourner ces problèmes, ce serait génial. La seule chose que je peux penser est de prendre ma propre mesure performance.now()
chaque image et l'utiliser - mais il semble un peu inutile, l'ayant effectivement exécuté deux fois par trame, en plus des événements déclenchés et ainsi de suite.
J'ai ajouté un état d'arrêt à votre extrait. N'hésitez pas à revenir en arrière, mais de cette façon le code se termine à un moment donné :). –
Non, c'est cool. Merci, @MikeMcCaughan. – Whothehellisthat