我已经对画布如何工作做了一些研究.它应该是“立即模式”意味着它不记得它的图形是什么样的,只有位图在每次发生任何变化时都会保留.
这似乎表明画布不会在变化时重绘.
然而,当我在iPad上测试画布时(基本上我一直在画布上绘制平行线),当画布上有更多的线条时,帧速率会迅速降低.线条绘制速度更慢,速度更快.
这是否意味着画布实际上必须在变化中绘制整个事物?或者这种性能变化还有其他原因吗?
解决方法
HTML画布会在每次描边/填充调用后记住像素的最终状态.它从不重绘自己. (Web浏览器可能需要将最终图像的某些部分重新显示到屏幕上,例如,如果另一个HTML对象在画布上移动然后再移开,但这与重新发出绘图命令不同.
上下文始终记住其当前状态,包括您累积的任何路径.您可能(意外)没有清除“刷新”之间的路径,在第一帧上绘制一条线,在第二帧上绘制两条线,在第三帧上绘制三条线,等等. (你在调用ctx.closePath()和ctx.beginPath()吗?你在图纸之间清理画布了吗?)
这是an example,表明画布不会重绘自己.即使在成千上万行中,我也看到了与数百行相同的帧速率(Chrome上限为200fps,Firefox 8.0上为240fps,每帧绘制10行).
var lastFrame = new Date,avgFrameMS=5,lines=0; function drawLine(){ ctx.beginPath(); ctx.moveTo(Math.random()*w,Math.random()*h); ctx.lineTo(Math.random()*w,Math.random()*h); ctx.closePath(); ctx.stroke(); var now = new Date; var frameTime = now - lastFrame; avgFrameMS += (frameTime-avgFrameMS)/20; lastFrame = now; setTimeout(drawLine,1); lines++; } drawLine(); // Show the stats infrequently setInterval(function(){ fps.innerHTML = (1000/avgFrameMS).toFixed(1); l.innerHTML = lines; },1000);