【发布时间】:2011-04-26 01:33:43
【问题描述】:
我正在研究如何编写一个支持撤消的绘制程序,并且发现很可能命令模式就是我想要的。不过,我仍然无法理解,我希望有人能提供一个简单的答案或确认。
基本上,如果我要实现撤消命令的能力,例如在屏幕上标记一个实心圆圈,这是否意味着我需要将圆圈覆盖到内存中的帧缓冲区复制到这个命令对象中?我看不出有任何其他方法可以撤消可能发生的事情,例如,在一堆随机像素颜色上加盖印章。
我听说一种方法是跟踪前向操作,当执行撤消时,您只需从第 1 步开始并向前拉到撤消前的步骤,但如果您要这样做,这似乎不可行支持大型撤消堆栈。
也许解决方案介于您保留每 15-20 个操作的位图并从最后一次“保存”转发开始。
有人可以提供任何关于在这种情况下典型接受的方法的见解,或者在命令中保存缓冲区矩形,重做每个动作,或者我完全错过了什么?
更新:很多好评。感谢大家。我正在从我正在阅读的内容中考虑,我将通过每 N 个操作保存缓冲区来解决此问题,并且当用户发出撤消命令时,从最近保存的缓冲区中重做所有命令。我可以将 N 调整到尽可能高的值,不会明显影响需要响应式撤消的用户体验(以最大限度地减少内存使用),但我怀疑在这一点上没有真正确定,我应该是能够在一帧中执行相当多的动作,这还不算太糟糕。希望这种方法能让我快速确定是否转向另一个方向,而是为需要它的操作保存先前状态的位图矩形。
【问题讨论】:
-
我的 0.02 美元:实现任何最容易编写和维护的方法,并从那里进行优化。尝试以这样一种方式设计您的代码,以便您可以在以后更改实现它的方式。您可能必须制作某种缓存/交换文件才能支持“无限”撤消。
-
如果不清除画布的“脏”部分(WRT 撤消)并重做 all 绘图操作,我想不出一种方法来实现这一点从头开始,或者保留帧缓冲区的各种备份,并且只从那里重新绘制。
-
除非你能想出你执行的任何绘图操作的数学负数,并应用它,只存储这些操作的用户输入(以及必须生成的任何随机种子)。这不适用于不透明的东西,但可能适用于最终不会在任何时候达到颜色限制的过滤器。
标签: command design-patterns paint undo