内存有限时,位图编辑器的快速撤消/重做?

mem*_*com 12 algorithm optimization design-patterns undo

我正在尝试为移动设备编写位图编辑器(即Photoshop的有限版本).用户的文档由大约1000x500大小的~4位图组成.

我想要一个尽可能简单的强大而高效的撤销/重做系统.我的目标是大约0.2秒来撤消或重做编辑.我正在寻找关于我目前的预期方法或我可以使用的一些新想法的一些反馈.我认为我所拥有的东西太复杂了,所以我对继续进行谨慎,所以只要知道我能做的最好就会很好.

我已经尝试了使用Command模式和Memento模式的组合来实现我的撤销/重做系统.到目前为止我得出的一些结论是:

  1. 我没有足够的内存,我不能足够快地将内存写入磁盘,以便在许多情况下使用纪念品支持上一个命令的"未执行"操作,例如,如果用户很快就进行了几次单独的绘画操作,我就不会能够存储表示用户绘制内容的位图,而不会让用户等待保存它们.

  2. 如果我将文档恢复到其初始状态并重放除最后一个命令之外的所有命令以实现撤销,即使是适量的命令,例如重放10个绘画笔划或5个涂抹笔划需要~1秒,这也太慢了呆滞.

  3. 我可以通过将整个文档定期保存到磁盘并在播放命令之前恢复到此检查点来解决前一点.为了比上一个检查点更进一步撤消,我们在此之前重新加载检查点并重放命令.

方法2有3个工作正常,除了保存整个文档变得越来越慢,因为添加了更多的图层,并且它已经慢了4位图(等待5到10秒).因此,我需要修改3,以便我只保存自上次以来发生的变化.

由于许多命令仅在一个层上运行,因此仅保存自上一个检查点以来已修改的层是有意义的.例如,如果我有3个初始层,我已经指出可以保存检查点的位置,那么我的命令堆可能看起来像这样.

(Checkpoint1: Save layer 1, 2 and 3.)
Paint on layer 1
Paint on layer 1
(Checkpoint2: Save layer 1. Reuse saved layers 2 and 3 from Checkpoint1.)
Paint on layer 2
Paint on layer 2
(Checkpoint3: Save layer 2. Reuse saved layers 1 and 3 from Checkpoint2.)
Paint on layer 3
Paint on layer 3
Flip layer 3 horizontally.
(Checkpoint4: Save layer 3. Reuse saved layers 1 and 2 from Checkpoint3.)
Resize layer 1, 2 and 3.
(Checkpoint5: Save layer 1, 2, 3.)
Run Code Online (Sandbox Code Playgroud)

在编辑过程中,我会跟踪自上一个检查点以来哪些图层已被修改.当我恢复检查点时,我只恢复已更改的图层,例如在修改第2层和第3层后恢复Checkpoint4,我从磁盘重新加载第2层和第3层的备份.添加检查点时,我只保存到目前为止已修改的图层.我可以使所有这些大部分都是自动的,除非我的界面中需要有用户被迫等待保存检查点的位置,因为我一次只能在内存中保留一层的临时副本.

你怎么看?它比我想要的复杂得多,但我看不到任何其他方式.还有其他有用的模式可以让我的生活更轻松吗?

Rit*_*tra 2

以下内容对于使用图像的图层和撤消缓冲区可能很方便:

  • 保留最新图像作为图像
  • 以前的版本与下一个版本存储为异或,然后(假设并非所有内容都以相同的方式更改或更改)使用简单的压缩算法(如行程编码)进行压缩

这样做有以下优点

  • 以前的版本可以很容易地合并(将它们异或在一起)。

这可能不适用于:

  • 颜色调整(色调、亮度等)
  • 坐标变换(裁剪、变形等)