html - Canvas 是否会在每次发生任何变化时重新绘制自己?

标签 html canvas

我对 Canvas 的工作原理做了一些研究。它应该是“立即模式”意味着它不记得它的绘图是什么样子,每次发生任何变化时只保留位图。

这似乎表明 canvas 不会在发生变化时重新绘制自身。
但是,当我在 iPad 上测试 Canvas 时(基本上我一直在 Canvas 上绘制平行线),当 Canvas 上有更多线条时,帧速率会迅速降低。线条的绘制速度更慢,而且更跳跃。

这是否意味着 Canvas 实际上必须在更改时绘制整个内容?或者还有其他原因导致这种性能变化?

最佳答案

HTML Canvas 会在每次调用笔划/填充后记住像素的最终状态。它从不重绘自己。 (Web 浏览器可能需要将最终图像的部分重新 blit 到屏幕,例如,如果另一个 HTML 对象在 Canvas 上移动然后再次离开,但这与重新发出绘图命令不同。

上下文总是记住它的当前状态,包括你已经积累的任何路径。您可能(不小心)没有清除“刷新”之间的路径,因此在第一帧画一条线,在第二帧画两条线,在第三帧画三线,等等。 (你在调用 ctx.closePath()ctx.beginPath() 吗?你在清除绘图之间的 Canvas 吗?)

这是 an example显示 Canvas 不会重绘自身。即使在数万行时,我看到的帧速率也与数百行相同(当每帧绘制 10 行时,在 Chrome 上上限为 200fps,在 Firefox 8.0 上上限为 ~240fps)。

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

有关您的代码实际在做什么以及您怀疑它在做什么的更多反馈,请与我们分享您的测试用例。

关于html - Canvas 是否会在每次发生任何变化时重新绘制自己?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8169663/

相关文章:

javascript - JQuery 和 Chrome 扩展

java使用线程来避免GUI死锁

html - 用纯(无 JS)HTML 和 CSS 绘制响应式井字棋盘

jquery - 如何从响应式设计中删除 slider

javascript - 为 javascript 游戏创建计时器会产生不良结果

javascript - 没有/低 alpha 的 Canvas PutImageData 颜色丢失

css - 防止在 Windows Phone 7 浏览器上进行页面平移

javascript - 加快 Canvas 的 getImageData

javascript - 在 div 的最后一行平铺 div 等高

html - 关于在使用某些第 3 方 css 框架时如何在网页中显示用户输入的 html 的任何想法