撤消/重做iOS绘画应用程序

时间:2015-01-30 17:38:52

标签: ios drawing opengl-es-2.0 paint undo-redo

我一直在研究为绘画应用程序实现撤消/重做功能的最佳方法。我在iOS上使用OpenGL ES 2.0。最流行的方法似乎是保存一个命令和VBO列表,以重新生成绘画到之前的状态(Memento设计结构)。另一种方法是在每次绘制操作后获取图形快照,并在撤消时恢复为这些快照。

我对这两种方法都有疑问:

1)Memento - 在一长串动作之后,特别是计算密集的泛洪填充算法,撤销/重做功能将变得非常缓慢和密集。

2)快照 - 在一长串操作之后,这些快照将开始占用大量内存,尤其是在处于原始状态时。

我想知道是否有人找到了适合这种情况的解决方案,或者也许有人知道如何优化上述方法。

感谢。

2 个答案:

答案 0 :(得分:1)

我认为没有办法限制可撤销的步骤数量。对于每个可撤消的操作,您将始终需要一些的内存量来捕获先前的状态或状态更改。

Command pattern实际上似乎比Memento更自然地处理撤消/重做。使用此选项,您将仅存储有关每个操作的特定更改的信息。根据操作情况,这仍然可能很大,但我认为它可能比用Memento盲目地保存整个对象状态更具针对性。

答案 1 :(得分:1)

我决定尝试混合方法,每10-15次操作保存一次位图快照,并使用命令行恢复快照之后的各个操作。这里提供了更深入的答案:https://stackoverflow.com/a/3944758/2303367