Понимание таймера JavaScript распараллеливает проблемы

Я запускаю на MMORPG JavaScript, который будет на самом деле работать гладко. В настоящее время я создал демонстрацию, чтобы доказать, что я могу переместить символы и сделать, чтобы они болтали друг с другом, а также видели друг друга переместиться живой.

http://set.rentfox.net/

Теперь таймеры JavaScript - что-то, что я не использовал экстенсивно, но от того, что я знаю, исправляю меня, если я неправ, то, что наличие нескольких setIntervals, происходящих одновременно, действительно не работает хорошо b/c, это - все на единственном потоке.

Позволяет говорят, что я хотел иметь 10 различных людей, уничтожающих шаровые молнии в монстре при помощи фонового расположения спрайта с setInterval - что анимация потребует 10 setIntervals выполнение перекрашивания DOM для спрайта позиционные фоном сдвиги. Разве это не было бы большим багги?

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

Надежда, которая имеет смысл и сообщает мне, должен ли я разъясниться далее.

7
задан Wayne Burkett 18 February 2011 в 22:29
поделиться

2 ответа

Проблема с несколькими setInterval имеет двоякий характер. Во-первых, как вы указываете, поскольку весь Javascript в браузерах (в настоящее время) является однопоточным, выполнение одного таймера может задержать выполнение следующего таймера. (Тем не менее, Рабочие потоки появятся; Firefox уже имеет их , как и Safari 4 [и, возможно, другие]). Во-вторых, таймер срабатывает с заданным интервалом, но если ваш обработчик все еще работает, когда этот интервал истекает, второй интервал полностью пропускается. Например, таймер может мешать самому себе.

Эта последняя часть требует дополнительных пояснений: допустим, у вас есть setInterval на 10 мс (что является самым быстрым, которого вы можете разумно ожидать от любой реализации; могут быть ограничены, чтобы они не работали быстрее, чем это). Если ваш обработчик занимает 13 мс, интервал, который должен был произойти через 10 мс после его начала, будет полностью пропущен.

Я обычно использую setTimeout для такого рода вещей. Когда мой обработчик запускается, я делаю свою работу, а затем планирую следующее событие в конце обработчика. Затем (в пределах того, в чем вы можете быть уверены), я знаю, что следующее событие произойдет через этот интервал.

Кажется, что для того, что вы делаете, лучше всего подойдет таймер с одним «пульсом», который прорабатывает все, что ему нужно, на пульсе. Использует ли этот импульсный таймер setInterval или setTimeout - это вопрос суждения, основанный на том, что вы видите с помощью вашего фактического кода.

11
ответ дан 6 December 2019 в 15:19
поделиться

+1 к TJ Crowder, ответ был идеальным. Я настоятельно рекомендую научиться использовать Canvas поверх узлов DOM для игровой анимации; последний работает медленно и глючит, и в любой нетривиальной ситуации он может зависнуть. OTOH, Canvas намного быстрее и может быть ускорен аппаратно, и даже имеет трехмерный контекст, если вам это нужно.

3
ответ дан 6 December 2019 в 15:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: