【问题标题】:Undo in painting apps like Penultimate and iDraft在 Penultimate 和 iDraft 等绘画应用程序中撤消
【发布时间】:2011-05-21 08:47:11
【问题描述】:

在 iDraft 和 Penultimate 等应用中,它们可以很好地执行撤消和重做,没有任何延迟。

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

谁能给点提示?

【问题讨论】:

  • 查看我对这篇帖子的回答stackoverflow.com/questions/4350715/…
  • 为什么每次操作后都需要wright归档。从磁盘写入和读取比简单地访问内存要花费更长的时间。另外我建议使用苹果优秀的系统分析工具来找到你的瓶颈。

标签: iphone nsdata undo paint


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-04-26
        • 2011-09-11
        • 2015-03-30
        • 2014-01-16
        • 2016-09-20
        • 2014-12-21
        • 1970-01-01
        • 2014-06-29
        • 2011-12-13
        相关资源
        最近更新 更多