Как организовать игровые циклы?
Обновление картинки в js весим на requestAnimationFrame.
Из-за однопоточной сути js вместо циклаwhile(game_is_running){
  update_game();
  sleep(time);
}
для обновления модели используем таймеры с поправкой, что-то в стилеvar update = Date.now();
function f(){
  var last = update;
  update_game();
  update = Date.now();
  if(game_is_running) setTimeout(f, time - update + last);
}
f();
Не знаю ка обстоит дело с играми на JS, но на C++ в функцию update передаётся время с прошлого апдейта, как правило, в милисекундах. Это время удобно учитывать для перемещения объекта. void update(float dt)
{
float traveled = getSpeed() * dt + getTravaledDistance();
setTraveledDistance(traveled);
}
При этом функция отрисовки и функция обновления выполняются в одном потоке (иначе нужно будет синхронизировать потоки, лочить некоторые методы и т.д.).
А если игра вдруг подвисла, то в апдейт может прийти довольно большое значение времени и тогда игровые элементы могут сделать резкий скачок. Чтобы избавиться от этого можно обрезать максимально возможное время в главном цикле:// main loop
while(!done)
{
float dt = getTimeSinceLastUpdate();
dt = min(33.3, dt); // equals 30 fps
update(dt);
render();
}