Лучший способ получить время в миллисекундах в javascript?
Есть ли альтернатива в JavaScript для получения времени в миллисекундах с использованием объекта даты или, по крайней мере, для повторного использования этого объекта, без необходимости создавать экземпляр нового объекта каждый раз, когда мне нужно получить это значение? Я спрашиваю об этом, потому что я пытаюсь сделать простой движок игры в JavaScript, и при расчете "времени дельта-кадра" мне нужно создать новый объект Date каждый кадр. Хотя я не беспокоюсь о последствиях этого, у меня возникают некоторые проблемы с надежностью точного времени, возвращаемого этим объектом.
Я получаю некоторые странные "прыжки" в анимации каждую секунду или около того, и я не уверен, связано ли это с сборкой мусора JavaScript или ограничением объекта Date при его обновлении так быстро. Если я установил значение дельта для некоторой константы, тогда анимация будет идеально гладкой, поэтому я уверен, что этот "прыжок" связан с тем, как я получаю время.
Единственным подходящим кодом, который я могу дать, является способ вычисления дельта-времени:
prevTime = curTime;
curTime = (new Date()).getTime();
deltaTime = curTime - prevTime;
При вычислении движения/анимации я умножаю постоянное значение с дельта-временем.
Если нет способа избежать получения времени в миллисекундах с помощью объекта Date, будет ли функция, которая увеличивает значение переменной (это истекшее время в миллисекундах с начала игры) и вызывается с помощью функции SetTimer в ставка один раз в миллисекунды является эффективной и надежной альтернативой?
Изменить: я сейчас тестировал свой код в разных браузерах, и кажется, что этот "прыжок" действительно проявляется только в Chrome, а не в Firefox. Но было бы неплохо, если бы был метод, который работал в обоих браузерах.
Ответы
Ответ 1
Попробуйте Date.now().
Пропуск, скорее всего, связан с сборкой мусора. Как правило, сбор мусора можно избежать, используя как можно больше переменных, но я не могу сказать конкретно, какие методы вы можете использовать для уменьшения пауз в сборе мусора.
Ответ 2
Насколько я знаю, вы можете получить время только с Date.
Date.now - это решение, но оно доступно не везде: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/now.
var currentTime = +new Date();
Это дает вам текущее время в миллисекундах.
Для ваших прыжков. Если вы вычисляете интерполяции правильно в соответствии с временем дельта-кадра, и у вас нет какой-либо ошибки округления номера, я держал пари для сборщика мусора ( ГХ).
Если в вашем цикле создано много созданного временного объекта, сборка мусора должна блокировать поток, чтобы выполнить некоторую очистку и реорганизацию памяти.
В Chrome вы можете увидеть, сколько времени GC проводит на панели Timeline.
EDIT: Поскольку мой ответ, Date.now()
следует рассматривать как лучший вариант, поскольку он поддерживается везде и на IE >= 9.
Ответ 3
Я знаю, что это довольно старый поток, но чтобы поддерживать актуальность и актуальность, вы можете использовать более точные функции performance.now()
, чтобы получить более точное зернистое время в javascript.
window.performance = window.performance || {};
performance.now = (function() {
return performance.now ||
performance.mozNow ||
performance.msNow ||
performance.oNow ||
performance.webkitNow ||
Date.now /*none found - fallback to browser default */
})();
Ответ 4
Это очень старый вопрос - но все же для справки, если другие смотрят на него - requestAnimationFrame()
- это правильный способ обработки анимации в современных браузерах:
UPDATE: ссылка mozilla показывает, как это сделать - мне не хотелось повторять текст по ссылке;)
Ответ 5
Если у вас есть объект даты, например
var date = new Date('2017/12/03');
то есть встроенный метод в javascript для получения даты в формате миллисекунд, который valueOf()
date.valueOf(); //1512239400000 in milliseconds format
Ответ 6
лучший способ и самый короткий способ эха
var d = new Date();
var n = d.getTime();
alert (n);