Undo/Redo 用于 iOS 绘画应用
Undo/Redo for iOS Painting App
我一直在研究什么是绘画应用程序实现 undo/redo 功能的最佳方式。我在 iOS 上使用 OpenGL ES 2.0。最流行的方法似乎是保存一个命令列表和 VBO,以将绘画重新生成到以前的状态(Memento 设计结构)。另一种方法是在每次绘图操作后拍摄图形快照,并在撤消时恢复到这些快照。
我对这两种方法都有疑问:
1) 纪念品 - 在一长串操作之后,尤其是计算密集型洪水填充算法,undo/redo 功能将变得非常缓慢和密集。
2) 快照 - 在一长串操作之后,这些快照将开始占用大量内存,尤其是在原始状态下。
我想知道是否有人找到了适合这种情况的解决方案,或者这里有人知道如何优化上述方法。
谢谢。
我认为没有办法限制可撤消的步骤数。对于每个可撤消的操作,您将始终需要 一些 的内存量来捕获先前状态或状态更改。
Command pattern 实际上似乎比 Memento 更适合处理 undo/redo。使用它,您将只存储有关每个操作的特定更改的信息。根据操作的不同,这仍然很重要,但我认为它比盲目地用 Memento 保存整个对象状态更有针对性。
我决定尝试一种混合方法,我每 10-15 个动作保存一个位图快照,并使用命令行恢复快照后的单个动作。这里提供了更深入的答案:
我一直在研究什么是绘画应用程序实现 undo/redo 功能的最佳方式。我在 iOS 上使用 OpenGL ES 2.0。最流行的方法似乎是保存一个命令列表和 VBO,以将绘画重新生成到以前的状态(Memento 设计结构)。另一种方法是在每次绘图操作后拍摄图形快照,并在撤消时恢复到这些快照。
我对这两种方法都有疑问:
1) 纪念品 - 在一长串操作之后,尤其是计算密集型洪水填充算法,undo/redo 功能将变得非常缓慢和密集。
2) 快照 - 在一长串操作之后,这些快照将开始占用大量内存,尤其是在原始状态下。
我想知道是否有人找到了适合这种情况的解决方案,或者这里有人知道如何优化上述方法。
谢谢。
我认为没有办法限制可撤消的步骤数。对于每个可撤消的操作,您将始终需要 一些 的内存量来捕获先前状态或状态更改。
Command pattern 实际上似乎比 Memento 更适合处理 undo/redo。使用它,您将只存储有关每个操作的特定更改的信息。根据操作的不同,这仍然很重要,但我认为它比盲目地用 Memento 保存整个对象状态更有针对性。
我决定尝试一种混合方法,我每 10-15 个动作保存一个位图快照,并使用命令行恢复快照后的单个动作。这里提供了更深入的答案: