¿Existe una alternativa en JavaScript para obtener tiempo en milisegundos usando el objeto de fecha, o al menos una forma de reutilizar ese objeto, sin tener que crear una instancia de un nuevo objeto cada vez que necesito obtener este valor? Pregunto esto porque estoy tratando de hacer un motor de juego simple en JavaScript, y al calcular el "tiempo de fotograma delta", tengo que crear un nuevo objeto Date en cada fotograma. Si bien no estoy demasiado preocupado por las implicaciones de rendimiento de esto, estoy teniendo algunos problemas con la confiabilidad del tiempo exacto devuelto por este objeto.
Recibo algunos "saltos" extraños en la animación, cada segundo más o menos, y no estoy seguro de si esto está relacionado con la Recolección de Basura de JavaScript o una limitación del objeto Fecha cuando se actualiza tan rápido. Si establezco el valor delta en alguna constante, entonces la animación es perfectamente fluida, así que estoy bastante seguro de que este "salto" está relacionado con la forma en que obtengo el tiempo.
El único código relevante que puedo dar es la forma en que calculo el tiempo delta:
prevTime = curTime;
curTime = (new Date()).getTime();
deltaTime = curTime - prevTime;
Al calcular el movimiento / animación, multiplico un valor constante con el tiempo delta.
Si no hay forma de evitar obtener el tiempo en milisegundos usando el objeto Fecha, sería una función que incremente una variable (que es el tiempo transcurrido en milisegundos desde que comenzó el juego), y que se llama usando la función SetTimer a una velocidad de una vez cada milisegundo sea una alternativa eficiente y confiable?
Editar: he probado mi código ahora en diferentes navegadores y parece que este "salto" en realidad solo es aparente en Chrome, no en Firefox. Pero aún sería bueno si hubiera un método que funcionara en ambos navegadores.
fuente
Date.getMilliseconds
solo devuelve los milisegundos en el segundo actual, es decir, de 0 a 999? No está utilizando esta función en su ejemplo, pero ¿tal vez se está utilizando en otro lugar o en una rama diferente?Respuestas:
Prueba Date.now () .
La omisión probablemente se deba a la recolección de basura. Por lo general, la recolección de basura se puede evitar reutilizando las variables tanto como sea posible, pero no puedo decir específicamente qué métodos puede usar para reducir las pausas de recolección de basura.
fuente
Sé que este es un hilo bastante antiguo, pero para mantener las cosas actualizadas y más relevantes, puede usar la
performance.now()
funcionalidad más precisa para obtener una sincronización de grano más fina en javascript.fuente
Date.now
lugar de una expresión de función anónimaperformance.now()
da tiempo monótono, a diferencia del tiempo deDate
. Significa que cada llamada posterior está garantizada para devolver un valor no menor que el anterior.Hasta donde sé, solo puedes tener tiempo con Date .
Date.now es la solución, pero no está disponible en todas partes: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/now .
Esto le da la hora actual en milisegundos.
Por tus saltos . Si calcula las interpolaciones correctamente de acuerdo con el tiempo del cuadro delta y no tiene algún error de número de redondeo , apuesto por el recolector de basura (GC).
Si hay muchos objetos temporales creados en su ciclo, la recolección de basura tiene que bloquear el hilo para hacer una limpieza y reorganización de la memoria.
Con Chrome, puede ver cuánto tiempo pasa el GC en el panel Línea de tiempo .
EDITAR: desde mi respuesta,
Date.now()
debería considerarse como la mejor opción, ya que es compatible en todas partes y en IE> = 9.fuente
+
saque en+new
?+
simplemente echadosDate
aNumber
, dando una indicación de la hora estándar de UNIX en milisegundos. Usted puede obtener este valor de forma explícita llamando(new Date()).getTime()
Date.now()
ahora se prefiere ya que su soporte es lo suficientemente grande ahora.+
que.getTime()
... Es más sencillo y no es necesario memorizar los nombres de funcionesSi tiene un objeto de fecha como
entonces hay un método incorporado en javascript para obtener la fecha en formato de milisegundos que es valueOf ()
fuente
Esta es una pregunta muy antigua, pero aún como referencia si otros la están mirando,
requestAnimationFrame()
es la forma correcta de manejar la animación en los navegadores modernos:ACTUALIZACIÓN: El enlace de Mozilla muestra cómo hacer esto: no tenía ganas de repetir el texto detrás del enlace;)
fuente
requestAnimationFrame
que hace que se detenga este "salto" como se describe en la pregunta. ¡Gracias!