Подтвердить что ты не робот

Лучший способ получить время в миллисекундах в javascript?

Есть ли альтернатива в JavaScript для получения времени в миллисекундах с использованием объекта даты или, по крайней мере, для повторного использования этого объекта, без необходимости создавать экземпляр нового объекта каждый раз, когда мне нужно получить это значение? Я спрашиваю об этом, потому что я пытаюсь сделать простой движок игры в JavaScript, и при расчете "времени дельта-кадра" мне нужно создать новый объект Date каждый кадр. Хотя я не беспокоюсь о последствиях этого, у меня возникают некоторые проблемы с надежностью точного времени, возвращаемого этим объектом.

Я получаю некоторые странные "прыжки" в анимации каждую секунду или около того, и я не уверен, связано ли это с сборкой мусора JavaScript или ограничением объекта Date при его обновлении так быстро. Если я установил значение дельта для некоторой константы, тогда анимация будет идеально гладкой, поэтому я уверен, что этот "прыжок" связан с тем, как я получаю время.

Единственным подходящим кодом, который я могу дать, является способ вычисления дельта-времени:

prevTime = curTime;
curTime = (new Date()).getTime();
deltaTime = curTime - prevTime;

При вычислении движения/анимации я умножаю постоянное значение с дельта-временем.

Если нет способа избежать получения времени в миллисекундах с помощью объекта Date, будет ли функция, которая увеличивает значение переменной (это истекшее время в миллисекундах с начала игры) и вызывается с помощью функции SetTimer в ставка один раз в миллисекунды является эффективной и надежной альтернативой?

Изменить: я сейчас тестировал свой код в разных браузерах, и кажется, что этот "прыжок" действительно проявляется только в Chrome, а не в Firefox. Но было бы неплохо, если бы был метод, который работал в обоих браузерах.

4b9b3361

Ответ 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);