在Penultimate和iDraft等绘画应用程序中撤消

在像iDraft和Penultimate这样的应用程序中,他们可以毫不拖延地执行undos和redos。 我尝试了很多方法。目前,我的测试应用程序使用[NSData writeToFile:atomically:]在每次撤消后将原始像素数据直接写入文件,但我得到0.6秒的延迟。 任何人都可以提供一些提示吗?     
已邀请:
我不知道iDraft和Penultimate,但他们有可能拥有比你更简单的绘图模型。编写绘图应用程序时,您可以在两个基本绘图表示之间进行选择:跟踪原始像素,或跟踪绘图对象,如线条,圆圈等。 (或者,换句话说,您可以在像素和矢量表示之间进行选择。) 使用矢量绘制时,不会跟踪单个像素。相反,你知道在给定宽度,颜色和其他参数的点X和Y之间应该存在直线。当你要绘制这样的表示时,你可以调用Quartz来划线。在这种情况下,模型(绘图表示)由几个数字组成,占用很少的内存,因此您可以在内存中拥有单个绘图的多个版本,从而可以快速方便地进行撤消和重做。     
将撤消堆栈保留在内存中。不要为每个操作写入磁盘。无论是保留位图还是向量,您的文件操作都不应该在您执行的每个绘制操作的关键路径上。 如果您的数据模型是完整的位图,请保留更改的rect以进行撤消/重做。     
如前所述,您可能不需要为每个操作将数据写入磁盘,也是基于像素的情况,除非您尝试撤消全屏过滤器,您需要保留的是边界矩形中包含的数据用户执行的画笔笔划。 您可以对绘图进行双重缓冲,即在绘制之前保留图像的副本,绘制到副本中,确定用户操作的边界矩形,复制并保留原始图像中的相应数据(包括大小和位置信息)。在撤消时,您将该副本粘贴并修改到修改后的区域。 此方法扩展为重做,在撤消时将占用您要覆盖的区域并将其存储。     

要回复问题请先登录注册