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

时间:2010-12-07 03:40:04

标签: iphone nsdata undo paint

在像iDraft和Penultimate这样的应用程序中,他们可以毫不拖延地执行undos和redos。

我尝试了很多方法。目前,我的测试应用程序使用[NSData writeToFile:atomically:]在每次撤消后将原始像素数据直接写入文件,但我的延迟时间为0.6秒。

任何人都可以提供一些提示吗?

3 个答案:

答案 0 :(得分:1)

我不知道iDraft和Penultimate,但他们有可能拥有比你更简单的绘图模型。编写绘图应用程序时,您可以在两个基本绘图表示之间进行选择:跟踪原始像素,或跟踪绘图对象,如线条,圆圈等。 (或者,换句话说,您可以在像素和矢量表示之间进行选择。)

使用矢量绘制时,不会跟踪单个像素。相反,你知道在给定宽度,颜色和其他参数的点X和Y之间应该存在直线。当你要绘制这样的表示时,你可以调用Quartz来划线。在这种情况下,模型(绘图表示)由几个数字组成,占用很少的内存,因此您可以在内存中拥有单个图形的多个版本,从而可以快速方便地进行撤消和重做。

答案 1 :(得分:1)

将撤消堆栈保留在内存中。不要为每个操作写入磁盘。无论是保留位图还是向量,您的文件操作都不应该在您执行的每个绘制操作的关键路径上。

如果您的数据模型是完整的位图,请仅保留更改的矩形以进行撤消/重做。

答案 2 :(得分:0)

如前所述,您可能不需要为每个操作都将数据写入磁盘,也就是基于像素的情况,除非您尝试撤消全屏过滤器,您需要保留的只是包含在内的数据用户执行的画笔描边的边界矩形。

您可以对绘图进行双重缓冲,即在绘制之前保留图像的副本,绘制到副本中,确定用户操作的边界矩形,复制并保留原始图像中的相应数据(带有大小和位置信息) )。在撤消时,您将该副本粘贴并修改到修改后的区域。

此方法扩展到重做,在撤消时占用您将要覆盖的区域并存储它。