Моя цель — создать эффективный игровой цикл, который использует requestAnimationFrame
для обновления холста отображения и setTimeout
для обновления игровой логики. Мой вопрос: следует ли помещать все операции рисования в цикл requestAnimationFrame
или только основную операцию рисования, которая обновляет холст html?
Под «всеми операциями рисования» я подразумеваю всю буферизацию. Например, я рисовал все свои спрайты в буфере, а затем рисовал буфер на основном холсте. С одной стороны, если я перенесу всю буферизацию в 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();
}
}
Спасибо!
Редактировать:
Я решил пойти с веб-воркерами, чтобы полностью отделить игровую логику от рисования, которое, насколько я понимаю, должно происходить в основном скрипте, загружаемом DOM.
update
работает медленно, он все равно будет блокировать RAF. Асинхронный код не означает, что он многопоточный. Подумайте об использовании рабочих, если у вас есть проблемы с производительностью. - person zzzzBov   schedule 24.04.2015