Existe-t-il une alternative en JavaScript pour obtenir le temps en millisecondes en utilisant l'objet date, ou au moins un moyen de réutiliser cet objet, sans avoir à instancier un nouvel objet à chaque fois que j'ai besoin d'obtenir cette valeur ? Je pose cette question parce que j'essaie de créer un moteur de jeu simple en JavaScript, et lors du calcul du "delta frame time", je dois créer un nouvel objet Date à chaque frame. Bien que je ne sois pas trop inquiet des conséquences de cette opération sur les performances, j'ai quelques problèmes avec la fiabilité de l'heure exacte renvoyée par cet objet.
J'obtiens des "sauts" étranges dans l'animation, toutes les secondes environ, et je ne sais pas si cela est lié au Garbage Collection de JavaScript ou à une limitation de l'objet Date lors d'une mise à jour aussi rapide. Si je fixe la valeur du delta à une constante, l'animation est parfaitement fluide. Je suis donc certain que ce "saut" est lié à la façon dont j'obtiens l'heure.
Le seul code pertinent que je peux donner est la façon dont je calcule le temps delta :
prevTime = curTime;
curTime = (new Date()).getTime();
deltaTime = curTime - prevTime;
Lors du calcul du mouvement / de l'animation, je multiplie une valeur constante avec le temps delta.
S'il n'y a aucun moyen d'éviter d'obtenir le temps en millisecondes en utilisant l'objet Date, une fonction qui incrémente une variable (étant le temps écoulé en millisecondes depuis le début du jeu), et qui est appelée en utilisant la fonction SetTimer à un rythme d'une fois toutes les millisecondes serait-elle une alternative efficace et fiable ?
Edit : J'ai maintenant testé mon code dans différents navigateurs et il semble que ce "saut" ne soit vraiment apparent que dans Chrome, pas dans Firefox. Mais ce serait quand même bien s'il y avait une méthode qui fonctionne dans les deux navigateurs.
5 votes
Un objet par image est nada
3 votes
A propos de l'animation qui saute toutes les secondes, cela pourrait-il avoir un rapport avec le fait que
Date.getMilliseconds
renvoie uniquement les millisecondes de la seconde en cours, c'est-à-dire de 0 à 999 ? Vous n'utilisez pas cette fonction dans votre exemple, mais elle est peut-être utilisée ailleurs, ou sur une autre branche ?2 votes
Est-ce que les sauts sont liés à des problèmes bizarres de résolution en millisecondes ? D'après le Documents de Mozilla : "Lorsque vous utilisez now() pour créer des timestamps ou des identifiants uniques, gardez à l'esprit que la résolution peut être de 15 millisecondes sous Windows". Cela pourrait-il être lié aux hoquets ?
1 votes
@zashu c'était il y a longtemps, donc je ne me souviens pas des spécificités de cet exemple. Mais pour une application plus récente, en utilisant Date.now() je ne vois plus de saut.