Есть ли в JavaScript альтернатива получения времени в миллисекундах с использованием объекта даты или, по крайней мере, способ повторно использовать этот объект без необходимости создавать экземпляр нового объекта каждый раз, когда мне нужно получить это значение? Я спрашиваю об этом, потому что я пытаюсь создать простой игровой движок на JavaScript, и при вычислении «времени дельта-кадра» я должен создавать новый объект Date каждый кадр. Хотя меня не слишком беспокоят последствия этого для производительности, у меня возникают некоторые проблемы с надежностью точного времени, возвращаемого этим объектом.
Я получаю какие-то странные «прыжки» в анимации примерно каждую секунду, и я не уверен, связано ли это со сборкой мусора JavaScript или ограничением объекта Date при таком быстром обновлении. Если я установил значение дельты на некоторую константу, то анимация будет идеально плавной, поэтому я почти уверен, что этот «прыжок» связан с тем, как я получаю время.
Единственный соответствующий код, который я могу дать, - это способ вычисления дельта-времени:
prevTime = curTime;
curTime = (new Date()).getTime();
deltaTime = curTime - prevTime;
При вычислении движения / анимации я умножаю постоянное значение на дельта-время.
Если нет способа избежать получения времени в миллисекундах с помощью объекта Date, будет ли функция, которая увеличивает переменную (которая является истекшим временем в миллисекундах с момента запуска игры) и которая вызывается с использованием функции SetTimer со скоростью раз в миллисекунды быть эффективной и надежной альтернативой?
Изменить: я протестировал свой код в разных браузерах, и кажется, что этот «скачок» действительно заметен только в Chrome, а не в Firefox. Но все равно было бы неплохо, если бы существовал метод, работающий в обоих браузерах.
источник
Date.getMilliseconds
в текущей секунде возвращаются только миллисекунды, то есть от 0 до 999? Вы не используете эту функцию в своем примере, но, возможно, она используется где-то еще или в другой ветке?Ответы:
Попробуйте Date.now () .
Пропуск, скорее всего, связан со сборкой мусора. Обычно сборки мусора можно избежать, насколько это возможно, повторным использованием переменных, но я не могу конкретно сказать, какие методы вы можете использовать для уменьшения пауз при сборке мусора.
источник
Я знаю, что это довольно старый поток, но чтобы поддерживать актуальность и актуальность, вы можете использовать более точную
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 */ })();
источник
Date.now
вместо выражения анонимной функцииperformance.now()
дает монотонность, в отличие от времени отDate
. Это означает, что каждый последующий вызов гарантированно вернет значение не меньше предыдущего.Насколько я знаю, вы можете получить время только с помощью Date .
Date.now - это решение, но оно доступно не везде: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/now .
var currentTime = +new Date();
Это дает вам текущее время в миллисекундах.
Для твоих прыжков . Если вы правильно вычисляете интерполяцию в соответствии с временем дельта-кадра и у вас нет ошибки округления , я ставлю на сборщик мусора (GC).
Если в вашем цикле много созданных временных объектов, сборщик мусора должен заблокировать поток, чтобы произвести некоторую очистку и реорганизацию памяти.
В Chrome вы можете увидеть, сколько времени GC проводит на панели Timeline .
РЕДАКТИРОВАТЬ: Поскольку мой ответ,
Date.now()
следует рассматривать как лучший вариант, поскольку он поддерживается везде и в IE> = 9.источник
+
служит+new
?+
Просто броситьDate
вNumber
, давая стандартную метку времени в миллисекундах. Вы можете явно получить это значение, позвонив(new Date()).getTime()
Date.now()
это предпочтительнее сейчас, поскольку его поддержка сейчас достаточно велика.+
чем.getTime()
... Это проще, и мне не нужно запоминать имена функцийЕсли у вас есть объект даты, например
var date = new Date('2017/12/03');
то в javascript есть встроенный метод для получения даты в формате миллисекунд, который является valueOf ()
date.valueOf(); //1512239400000 in milliseconds format
источник
Это очень старый вопрос - но все же для справки, если на него смотрят другие, -
requestAnimationFrame()
это правильный способ обработки анимации в современных браузерах:ОБНОВЛЕНИЕ: ссылка mozilla показывает, как это сделать - мне не хотелось повторять текст за ссылкой;)
источник
requestAnimationFrame
, что останавливает этот "прыжок", как описано в вопросе. Благодарность!