Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html5 canvas 为什么画布会重新渲染整个画布,而不是只渲染特定部分?_Html5 Canvas - Fatal编程技术网

Html5 canvas 为什么画布会重新渲染整个画布,而不是只渲染特定部分?

Html5 canvas 为什么画布会重新渲染整个画布,而不是只渲染特定部分?,html5-canvas,Html5 Canvas,从我有限的html5画布经验来看,似乎制作动画的方法是清除整个画布,从头开始绘制所有内容 这似乎不是很有效。我想知道为什么选择这种方法 还有别的选择吗?例如,使用面向对象的方法,如果要在前景中重新渲染树,系统应该缓存背景,并且只重新渲染该层。您的理解是正确的 典型的画布应用程序将完全擦除画布并重新绘制对象 这个过程很好,因为Html画布的设计速度非常快 与面向对象设计不同,在画布上绘制的数据已完全“展平” 有一个数据数组,其中包含画布上所有像素的红色、绿色、蓝色和Alpha组件 [ p

从我有限的html5画布经验来看,似乎制作动画的方法是清除整个画布,从头开始绘制所有内容

这似乎不是很有效。我想知道为什么选择这种方法


还有别的选择吗?例如,使用面向对象的方法,如果要在前景中重新渲染树,系统应该缓存背景,并且只重新渲染该层。

您的理解是正确的

典型的画布应用程序将完全擦除画布并重新绘制对象

这个过程很好,因为Html画布的设计速度非常快

与面向对象设计不同,在画布上绘制的数据已完全“展平”

有一个数据数组,其中包含画布上所有像素的红色、绿色、蓝色和Alpha组件

[ 
    pixel1Red, pixel1Green, pixel1Blue, pixel1Alpha,
    pixel2Red, pixel2Green, pixel2Blue, pixel2Alpha,
    pixel3Red, pixel3Green, pixel3Blue, pixel3Alpha,
    ...
]
这意味着任何像素的任何颜色分量都可以通过一次跳转访问

这种平面结构还意味着,如果需要在画布上绘制图像,浏览器只需将源图像中的顺序数据直接复制到画布像素阵列中的顺序数据


此外,当GPU可用时,画布是硬件加速的。

这是基本技术,是的。您也可以使用
clearRect()
,清除画布的特定区域:

<强>在您更改前例和背景的情况下,考虑修改<代码> GuleCuleTyeActudio,这使您能够在现有形状下绘制形状:>/P>

// Draw new shapes behind the existing canvas content.
ctx.globalCompositeOperation = 'destination-over';

另一个有用的方法是
clip()
,它允许您将形状绘制为遮罩:

// Create a circular clipping path.
ctx.beginPath();
ctx.arc(0, 0, 60, 0, Math.PI * 2, true);
ctx.clip();

// Create a circular clipping path.
ctx.beginPath();
ctx.arc(0, 0, 60, 0, Math.PI * 2, true);
ctx.clip();