Existe uma alternativa no JavaScript de obter tempo em milissegundos usando o objeto de data ou pelo menos uma maneira de reutilizá-lo, sem ter que instanciar um novo objeto toda vez que eu precisar obter esse valor? Estou perguntando isso porque estou tentando criar um mecanismo de jogo simples em JavaScript e, ao calcular o "tempo de quadro delta", tenho que criar um novo objeto Date a cada quadro. Embora não esteja muito preocupado com as implicações de desempenho disso, estou tendo alguns problemas com a confiabilidade do tempo exato retornado por esse objeto.
Eu recebo alguns "pulos" estranhos na animação, a cada segundo ou mais, e não tenho certeza se isso está relacionado à Coleta de Lixo do JavaScript ou a uma limitação do objeto Date ao atualizar tão rápido. Se eu definir o valor delta como uma constante, a animação será perfeitamente suave, por isso tenho certeza de que esse "salto" está relacionado à maneira como ganho o tempo.
O único código relevante que posso fornecer é a maneira como calculo o tempo delta:
prevTime = curTime;
curTime = (new Date()).getTime();
deltaTime = curTime - prevTime;
Ao calcular movimento / animação, multiplico um valor constante pelo tempo delta.
Se não há como evitar o tempo em milissegundos usando o objeto Date, uma função que incrementa uma variável (sendo o tempo decorrido em milissegundos desde o início do jogo) e é chamada usando a função SetTimer a uma taxa de uma vez a cada milissegundo ser uma alternativa eficiente e confiável?
Edit: Eu testei agora meu código em diferentes navegadores e parece que esse "salto" é realmente aparente apenas no Chrome, não no Firefox. Mas ainda seria bom se houvesse um método que funcionasse nos dois navegadores.
fonte
Date.getMilliseconds
retornar apenas os milissegundos no segundo atual, ou seja, de 0 a 999? Você não está usando esta função no seu exemplo, mas talvez ela esteja sendo usada em outro lugar ou em uma ramificação diferente?Respostas:
Tente Date.now () .
O salto provavelmente ocorre devido à coleta de lixo. Normalmente, a coleta de lixo pode ser evitada reutilizando as variáveis o máximo possível, mas não posso dizer especificamente quais métodos você pode usar para reduzir as pausas na coleta de lixo.
fonte
Eu sei que esse é um tópico bastante antigo, mas para manter as coisas atualizadas e mais relevantes, você pode usar a
performance.now()
funcionalidade mais precisa para obter um melhor tempo de granulação em javascript.fonte
Date.now
em vez de uma expressão de função anônimaperformance.now()
dá tempo monotônico, ao contrário do tempoDate
. Isso significa que todas as chamadas subseqüentes são garantidas para retornar um valor não inferior ao anterior.Tanto quanto sei, você só pode ter tempo com o Date .
Date.now é a solução, mas não está disponível em todos os lugares: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/now .
Isso fornece o tempo atual em milissegundos.
Para seus saltos . Se você calcular as interpolações corretamente de acordo com o tempo do quadro delta e não tiver algum erro de número de arredondamento , aposto no coletor de lixo (GC).
Se houver muitos objetos temporários criados no seu loop, a coleta de lixo precisará bloquear o encadeamento para fazer alguma limpeza e reorganização da memória.
Com o Chrome, você pode ver quanto tempo o GC está gastando no painel Linha do tempo .
Edição: Desde a minha resposta,
Date.now()
deve ser considerada como a melhor opção, pois é suportada em todos os lugares e no IE> = 9.fonte
+
serviço serve+new
?+
simplesmente lançarDate
aNumber
, dando um timestamp unix padrão em milissegundos. Você pode explicitamente obter esse valor chamando(new Date()).getTime()
Date.now()
.+
que.getTime()
... É mais simples e eu não preciso memorizar os nomes de funçõesSe você tiver um objeto de data como
existe um método embutido no javascript para obter a data no formato de milissegundos, que é valueOf ()
fonte
Essa é uma pergunta muito antiga - mas ainda para referência, se outras pessoas estiverem olhando para ela -
requestAnimationFrame()
é a maneira certa de lidar com a animação nos navegadores modernos:ATUALIZAÇÃO: O link do mozilla mostra como fazer isso - não estava com vontade de repetir o texto por trás do link;)
fonte
requestAnimationFrame
isso impede esse "salto", conforme descrito na pergunta. Obrigado!