Моя цель - создать эффективный игровой цикл, который использует requestAnimationFrame
для обновления холста дисплея и setTimeout
для обновления игровой логики. Мой вопрос в том, должен ли я делать все операции рисования внутри цикла requestAnimationFrame
или только основной операции рисования, которая обновляет холст html?Как следует использовать requestAnimationFrame и setTimeout параллельно, чтобы создать лучший игровой цикл?
Что я имею в виду под «всеми операциями рисования» - это все буферизация. Например, я нарисую все спрайты в буфер, а затем нарисую буфер на основной холст. С одной стороны, если я поместил всю буферизацию в requestAnimationFrame
, я не буду тратить впустую процессор на каждое обновление логики, с другой стороны, чертеж тяжелый процессор и может привести к тому, что requestAniomationFrame
дождитесь завершения всех этих операций ... Точка отделения логических обновлений от чертежа такова, что requestAnimationFrame
не увязнет в обработке без рисования.
Есть ли у кого-нибудь опыт работы с этим подходом к созданию игрового цикла? И не говорите «просто поместите все это в requestAnimationFrame
», потому что это замедляет рендеринг. Я убежден, что отделить логику от рисования - путь. Вот пример того, что я говорю:
/* The drawing loop. */
function render(time_stamp_){//First parameter of RAF callback is timestamp.
window.requestAnimationFrame(render);
/* Draw all my sprites in the render function? */
/* Or should I move this to the logic loop? */
for (var i=sprites.length-1;i>-1;i--){
sprites[i].drawTo(buffer);
}
/* Update the on screen canvas. */
display.drawImage(buffer.canvas,0,0,100,100,0,0,100,100);
}
/* The logic loop. */
function update(){
window.setTimeout(update,20);
/* Update all my sprites. */
for (var i=sprites.length-1;i>-1;i--){
sprites[i].update();
}
}
Спасибо!
Edit:
Я решил пойти с веб-рабочих, чтобы полностью отделить логику игры от рисунка, который, насколько я понимаю, должен иметь место в главном сценарии загруженного DOM.
Если 'update' работает медленно, он все равно блокирует RAF. Асинхронный код не означает, что он многопоточен. Попытайтесь использовать работников, если у вас проблемы с производительностью. – zzzzBov
Я слышал о рабочих, знаете ли вы о хорошей документации? И являются ли они способом многопоточного JavaScript? – Frank
Хороший учебник для веб-мастеров: http://www.html5rocks.com/en/tutorials/workers/basics/ убедитесь, что в системах, которые их не поддерживают (или не являются многоядерными), у вас есть резерв ! – Rias