Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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
html画布像素缓冲区_Html_Canvas_Redraw - Fatal编程技术网

html画布像素缓冲区

html画布像素缓冲区,html,canvas,redraw,Html,Canvas,Redraw,我不知道正确的术语,但在GTK中我相信它被称为像素缓冲区。您可以将全部或部分绘图区域复制到一个pixbuf,然后将pixbuf转储回屏幕,而不必再次遍历和渲染整个图形。我正在实现一个菜单栏,菜单栏会下降并阻塞它下面的所有内容。但是,绘制整个画布需要几秒钟的时间,因此我想知道是否有正确的方法来复制下拉菜单将遮挡的所有内容,然后当下拉菜单关闭时,将其重新绘制到屏幕上。我想这可以通过context.getImageData()函数来实现,但我已经读到它效率极低。没错,getImageData()效率太

我不知道正确的术语,但在GTK中我相信它被称为像素缓冲区。您可以将全部或部分绘图区域复制到一个pixbuf,然后将pixbuf转储回屏幕,而不必再次遍历和渲染整个图形。我正在实现一个菜单栏,菜单栏会下降并阻塞它下面的所有内容。但是,绘制整个画布需要几秒钟的时间,因此我想知道是否有正确的方法来复制下拉菜单将遮挡的所有内容,然后当下拉菜单关闭时,将其重新绘制到屏幕上。我想这可以通过
context.getImageData()
函数来实现,但我已经读到它效率极低。

没错,
getImageData()
效率太低了。但对于你想做的事情,有一个更好的开始:

使用画布上下文的
drawImage
方法,您可以传入一个图像,但也可以传入另一个画布。因此,构建一个永远不会添加到页面的临时画布:

// only exists in javascript, not on the page
tempcanvas = document.createElement('canvas');
tempcanvas.height = (normal canvas width);
tempcanvas.width = (normal canvas height);
然后可以调用
tempcanvasContext.drawImage(normalCanvas,0,0)
在创建下拉菜单之前拍摄当前画布的快照。当下拉菜单消失时,您可以调用
normalcanvasContext.drawImage(tempcanvas,0,0)
将其拉回


我希望这提供了一个好的总体思路,并且应该比
getImageData
快得多。只需复制屏幕上要重画的确切部分,就可以提高效率。

的确,
getImageData()
的效率太低了。但对于你想做的事情,有一个更好的开始:

使用画布上下文的
drawImage
方法,您可以传入一个图像,但也可以传入另一个画布。因此,构建一个永远不会添加到页面的临时画布:

// only exists in javascript, not on the page
tempcanvas = document.createElement('canvas');
tempcanvas.height = (normal canvas width);
tempcanvas.width = (normal canvas height);
然后可以调用
tempcanvasContext.drawImage(normalCanvas,0,0)
在创建下拉菜单之前拍摄当前画布的快照。当下拉菜单消失时,您可以调用
normalcanvasContext.drawImage(tempcanvas,0,0)
将其拉回


我希望这提供了一个好的总体思路,并且应该比
getImageData
快得多。您可以通过只复制要重画的屏幕的确切部分来提高效率。

是的,
getImageData()
相当慢,但我认为您无法比本机实现更快。我想您最好编写一个类来处理画布上的图形作为对象。是的,
getImageData()
非常慢,但我认为您不能比本机实现更快。我想你最好写一个类来处理画布上的图形作为对象。Thanx,我来试试。不幸的是,我们无法指定要使用的tempcanvas的子集。那会更有帮助的。Thanx,我试试看。不幸的是,我们无法指定要使用的tempcanvas的子集。那会更有帮助。