什么是在HTML5 canvas元素内移动矩形(像素)区域的最快方法

问题描述:

我想实现HTML5 canvas元素内容的垂直滚动。我不想再次呈现整个内容。相反,我想将整个内容向上/向下移动,并只渲染已滚动到视图中的区域。什么是在HTML5 canvas元素内移动矩形(像素)区域的最快方法

我尝试使用getImageDataputImageData函数,但在我的测试中,它们几乎和重绘整个场景一样缓慢。

// scroll 20px down 
var data = ctx.getImageData(0, 0, width, height-20); 
ctx.putImageData(0, 20); 

复制画布元素中矩形像素区域的最快方法是什么?

尝试这种情况:

ctx.drawImage(ctx.canvas, 0, 0, width, height-20, 0, 20, width, height-20); 

drawImage可以带有HTMLImageElement,一个HTMLCanvasElementHTMLVideoElement对于第一个参数。

对于绝对速度,我会用一个过大<canvas><div>overflow:hidden设置,则使用常规的DOM方法来滚动<div><canvas>

当然,这牺牲了内存使用,以支持速度。

+0

好主意,但不幸的是我不知道确切的大小,滚动区域可能有数千像素的高度,所以我不认为这对我有用。 – 2010-01-11 12:22:08

+0

我希望在我的应用程序中实现滚动之前,我已经知道了这种方法。我用一个大的隐藏画布和一个小视口画布使用双缓冲。然后我将隐藏的新可见部分复制到视口。它可以工作,但可能会更快。如果图像可能高达数千像素,我的解决方案将无法工作。 – 2010-01-21 04:29:05

+0

但是如果没有期望能够向下滚动,当到达底部时,您可以重新绘制新的“超大”画布上的最后一个屏幕。如果你有任何停机时间(比如在信息流中暂停),你可以重绘和截断,然后甚至没有人注意到。前一种技术并没有消除延迟,但它肯定会限制它发生得少得多。 – 2010-05-04 23:28:53