这两者是否有任何不同:
ctx.fillStyle = "rgba(0, 0, 0, 1)";
ctx.fillRect(0, 0, 100, 100)
和
ctx.clearRect(0, 0, 100, 100)
是否会有任何性能差异或生成的图像或画布数据不同?
这两者是否有任何不同:
ctx.fillStyle = "rgba(0, 0, 0, 1)";
ctx.fillRect(0, 0, 100, 100)
和
ctx.clearRect(0, 0, 100, 100)
是否会有任何性能差异或生成的图像或画布数据不同?
ctx.fillStyle = "rgba(0, 0, 0, 1)";
的 fillRect()
将会使用不透明像素填充区域,即在此情况下是黑色(请注意,alpha 是一个标准化值 [0,1])。clearRect()
“清除”所有像素,使位图变为透明(技术上讲,该区域被填充为黑色透明像素)。
clearRect()
被优化过,而 fillRect()
受到合成/混合规则(Porter-Duff)的限制,因此前者更快。这意味着 clearRect 只能基于当前转换直接填充区域,而 fillRect 还必须按照设置的合成/混合公式(globalCompositeOperation)进行计算。
当然,这只是理论上的情况 - 实际效果取决于浏览器的实现。这里有一个简单的性能测试,显示在Chrome中填充速度比清除速度快(我不确定Chrome和画布当前的情况),但在Firefox中清除速度比填充速度快得多,两者都比Chrome显著地更快:
在支持上下文不透明度标志的浏览器中,如果您不需要它,可以禁用 alpha,以使画布响应更快(这里的 alpha 是与元素本身混合和与浏览器背景合成)。特别是在 Opera 浏览器中,您将看到速度的提高,但 Firefox 和 Chrome 也支持此标志。要禁用 alpha:var ctx = canvas.getContext("2d", {alpha: false});
clearRect
速度提升了大约10-12%。 - dtasev
clearRect()
[…] 将矩形内的所有像素设置为透明黑色。" - Bergi