我的目标是创建一个高效的游戏循环,使用
所谓“所有绘图操作”是指所有缓冲区操作。例如,我会把所有精灵绘制到缓冲区,然后将缓冲区绘制到主画布上。一方面,如果我把所有缓冲区操作都放在
有没有人有使用这种方法创建游戏循环的经验?不要说“把它全部放在
requestAnimationFrame
更新显示画布和setTimeout
更新游戏逻辑。我的问题是,我应该把所有绘图操作都放在requestAnimationFrame
循环内,还是只放主要的绘图操作来更新html画布?所谓“所有绘图操作”是指所有缓冲区操作。例如,我会把所有精灵绘制到缓冲区,然后将缓冲区绘制到主画布上。一方面,如果我把所有缓冲区操作都放在
requestAnimationFrame
中,就不会浪费CPU在每个逻辑更新上进行绘制,另一方面,绘制是CPU密集型的,可能会导致requestAnimationFrame
等待直到所有这些操作完成... 将逻辑更新与绘制分开的重点是,让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();
}
}
谢谢!
编辑:
我决定使用Web Workers来完全将游戏逻辑与绘图分离,从我的理解来看,这必须在由DOM加载的主脚本中进行。
update
运行缓慢,它仍会阻塞 RAF。异步代码并不意味着它是多线程的。如果您遇到性能问题,请考虑使用 workers。 - zzzzBov