位图编辑器应用程序的快速撤消工具

Rad*_*ent 11 iphone algorithm optimization design-patterns objective-c

我正在尝试为iPhone制作一个位图编辑器应用程序,它类似于画笔或图层或Photoshop的缩减版本.如果可能的话,我希望能够支持大约4层的1000x1000分辨率图像.

在我编写太多代码之前,我正在尝试设计我的撤销/重做系统,并且由于移动设备的局限性以及位图编辑器操作通常具有破坏性,因此我遇到了一个很好的解决方案.我所知道的最常见的撤销/重做设计是:

  1. 使用命令模式.您存储初始状态和用于将其转换为当前状态的命令.要撤消,请重新加载初始状态并重播除最后一个命令之外的所有命令.

  2. 使用纪念图案.每次操作后,您都会存储足够的信息以便还原该操作.

我预见到的问题是:

  1. 命令模式:500次编辑操作后我该怎么办?我想撤消最后一次?加载初始状态并应用499可能是耗时的,尤其是如果其中一些是昂贵的事情,例如应用模糊过滤器.我不喜欢撤消在不同场景下花费不同时间的方式.

  2. Memento模式:保存已修改的位图部分会占用大量内存.将这些位图缓存到磁盘也很慢(因此,如果用户进行大量快速编辑,我可能无法缓存位图)并且我不确定电池使用情况的影响.

我能想到的唯一解决方案是:

  1. 使用命令模式和纪念模式,其中,每10个命令左右或在昂贵的操作之后,整个状态也被保存(这为您提供免费的自动保存功能).要撤消,我会重新加载最近的快照,然后重播命令.我宁愿避免这种复杂性.

  2. 使用memento模式并强制用户等待缓存位图.如果我将这段时间用于等待过滤器应用,但在制作画笔笔划之间不能很好地工作,这也不算太糟糕.

有建议吗?我有兴趣知道一些现有的应用程序是如何做到这一点的.

我可以想到上面所有种类奇怪的混合物,但它们都有明显的问题.我所能想到的只是遇到一些这些问题或者破坏应用程序以使问题更简单(例如减小最大位图大小的大小).我注意到有几个应用程序的最大位图大小和图层限制相当低.

Mau*_*Mau 0

我想到了第三个选项:每个操作都在其自己的层上执行,撤消操作会删除该层。它需要快速渲染机制和“动作层”的智能表示,其中不存储“透明”(未触及)像素。

如果您假设u级撤消,则可以将早于u步的操作图层合并到后台。

您还可以采用混合方法。如果动作“小”,则将其表示为一层。如果它很大,作为录制的动作,则需要重播。正如您所说,您需要一种启发式方法来在两种情况之间做出决定。您可以在设置后首次运行应用程序时测试渲染/保存性能,并确定启发式的一些参数值。