html5 – 每当有任何变化时,Canvas会重绘自己吗?

前端之家收集整理的这篇文章主要介绍了html5 – 每当有任何变化时,Canvas会重绘自己吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经对画布如何工作做了一些研究.它应该是“立即模式”意味着它不记得它的图形是什么样的,只有位图在每次发生任何变化时都会保留.

这似乎表明画布不会在变化时重绘.
然而,当我在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);

见于行动:http://phrogz.net/tmp/canvas_refresh_rate.html

有关您的代码实际执行的内容与您怀疑它正在执行的操作的更多反馈,请与我们分享您的测试用例.

原文链接:https://www.f2er.com/html5/168353.html

猜你在找的HTML5相关文章