Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.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
在javascript画布中的2D上下文上实现撤销/重做的多画布的缺点?_Javascript_Canvas_Undo_Redo - Fatal编程技术网

在javascript画布中的2D上下文上实现撤销/重做的多画布的缺点?

在javascript画布中的2D上下文上实现撤销/重做的多画布的缺点?,javascript,canvas,undo,redo,Javascript,Canvas,Undo,Redo,目前,对于使用lineTo()绘制的所有线条,我都有一个单一的2d上下文/画布,但我想实现一个撤销/重做功能,如果不重新绘制整个画布或保存状态(,),这是不可能的 与其他方法相比,为绘制到堆栈上的每一行推送一个新画布是否有缺点?从时间复杂度的角度来看,撤销/重做将是O(1)而不是O(n),但我不确定是否会有其他问题。正如ggorlen和KAIDO所提到的,这里的缺点是内存,就像在其他帖子中保存以前的状态一样,因为每个画布仍然占用内存中整个画布的大小 正如ggorlen和kaido所提到的,这里的

目前,对于使用lineTo()绘制的所有线条,我都有一个单一的2d上下文/画布,但我想实现一个撤销/重做功能,如果不重新绘制整个画布或保存状态(,),这是不可能的


与其他方法相比,为绘制到堆栈上的每一行推送一个新画布是否有缺点?从时间复杂度的角度来看,撤销/重做将是O(1)而不是O(n),但我不确定是否会有其他问题。

正如ggorlen和KAIDO所提到的,这里的缺点是内存,就像在其他帖子中保存以前的状态一样,因为每个画布仍然占用内存中整个画布的大小

正如ggorlen和kaido所提到的,这里的缺点是内存,就像在其他帖子中保存以前的状态一样,因为每个画布仍然占用内存中整个画布的大小

您发布的第一个链接解释了这种方法对内存和性能的影响。您仍然使用这种方法保存状态,除了“状态”是整个画布,而不是数组中的几个数字。这里的O(1)是从哪里来的?请记住,每个画布在内存中的宽度*高度*4*8字节仅用于像素的数据。假设您有一个500x500px的绘图区域(在高清显示器上非常小),每个画布将占用8MB。有些操作系统(iOS)不允许您的页面总画布面积超过几个像素平方,因此在这些操作系统中,您最多可以保存不到十个状态。@kaido这正是我要找的。谢谢@我对HTML画布一无所知;为什么每个像素是32字节?我假设至少有四个(R、G、B、不透明)-其他28个是什么?@DaveNewton红、绿、蓝和Alpha通道都存储为UINT8比特。您发布的第一个链接几乎解释了这种方法对内存和性能的影响。您仍然使用这种方法保存状态,除了“状态”是整个画布,而不是数组中的几个数字。这里的O(1)是从哪里来的?请记住,每个画布在内存中的宽度*高度*4*8字节仅用于像素的数据。假设您有一个500x500px的绘图区域(在高清显示器上非常小),每个画布将占用8MB。有些操作系统(iOS)不允许您的页面总画布面积超过几个像素平方,因此在这些操作系统中,您最多可以保存不到十个状态。@kaido这正是我要找的。谢谢@我对HTML画布一无所知;为什么每个像素是32字节?我假设至少有四个(R、G、B、不透明)-其他28个是什么?@DaveNewton红、绿、蓝和Alpha通道都存储为UINT8位