Есть ли более точный способ создания таймера Javascript, чем setTimeout? - PullRequest
66 голосов
/ 13 октября 2008

Что меня всегда беспокоило, так это непредсказуемость метода setTimeout() в Javascript.

По моему опыту, таймер ужасно неточен во многих ситуациях. Под неточным я подразумеваю, что фактическое время задержки, кажется, изменяется на 250-500 мс больше или меньше. Хотя это не так много времени, при использовании его, чтобы скрыть / показать элементы пользовательского интерфейса, время может быть заметно заметно.

Есть ли какие-то приемы, которые можно сделать для обеспечения точного выполнения setTimeout() (без обращения к внешнему API) или это безнадежная причина?

Ответы [ 16 ]

0 голосов
/ 31 мая 2015

Вы можете использовать html5 webaudio clock , который использует системное время для большей точности

0 голосов
/ 13 октября 2008

Тайм-ауты JavaScript имеют ограничение по умолчанию 10-15 мс (я не уверен, что вы делаете, чтобы получить 200 мс, если вы не делаете 185 мс фактического выполнения JS). Это происходит из-за того, что окна имеют стандартное разрешение таймера 15 мс, единственный способ добиться большего - использовать таймеры с более высоким разрешением Windows, которые являются общесистемными настройками, поэтому они могут работать с другими приложениями в системе, а также жевать батареи (Chrome ошибка от Intel по этому вопросу).

Стандарт defacto 10-15 мс обусловлен тем, что люди используют тайм-ауты 0 мс на веб-сайтах, но затем кодируют таким образом, который предполагает, что тайм-аут составляет 10-15 мс (например, js-игры, которые предполагают 60 кадров в секунду, но просят 0 мс / кадр без разницы) логика, так что игра / сайт / анимация идет на несколько порядков быстрее, чем предполагалось). Чтобы учесть это, даже на платформах, где нет проблем с таймером Windows, браузеры ограничивают разрешение таймера до 10 мс.

0 голосов
/ 13 октября 2008

Дэн, исходя из моего опыта (который включает в себя реализацию языка SMIL2.1 в JavaScript, где управление временем находится в теме), я могу заверить вас, что на самом деле вам никогда не нужна высокая точность setTimeout или setInterval.

Что, однако, имеет значение, так это порядок, в котором setTimeout / setInterval выполняется в очереди - и это всегда работает отлично.

0 голосов
/ 13 октября 2008

Здесь определенно есть ограничение. Чтобы дать вам некоторое представление, только что выпущенный Google браузер Chrome достаточно быстр, чтобы он мог выполнять setTimeout (function () {}, 0) за 15-20 мс, в то время как более ранние механизмы Javascript выполняли эту функцию за сотни миллисекунд. Хотя setTimeout использует миллисекунды, ни одна виртуальная машина javascript на данный момент не может выполнить код с такой точностью.

0 голосов
/ 13 октября 2008

По моему опыту, это потерянное усилие, даже несмотря на то, что наименьшее разумное количество времени, в течение которого я когда-либо распознавал актерскую игру, составляет около 32-33 мс. ...

0 голосов
/ 13 октября 2008

Ненавижу это говорить, но я не думаю, что есть способ облегчить это. Я действительно думаю, что это зависит от клиентской системы, поэтому более быстрый механизм или машина javascript может сделать его немного более точным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...