Joe*_*oey 15 command design-patterns undo paint
我正在研究如何编写支持撤消的绘制程序,并且很可能看到命令模式是我想要的.但是,有些东西仍然逃避了我,我希望有人可以提供一个简单的答案或确认.
基本上,如果我要体现撤消命令的能力,例如在屏幕上标记一个实心圆,这是否意味着我需要将圆覆盖的帧缓冲区本质复制到这个命令对象中?我没有看到任何其他方法可以撤消可能的内容,例如,标记一堆随机像素颜色.
我听说过一种方法只是跟踪前进动作,当执行撤消时,你只需从步骤1开始并向前绘制到撤消之前的步骤,但如果你要支持一个大的话,这似乎是不可行的撤消堆栈.
也许解决方案介于每个15-20个操作的位图之间,并从最后一个"保存"转发开始.
在这种情况下,有人可以提供有关典型接受方法的任何见解,可以在命令中保存缓冲区矩形,重做每个操作前进,还是我完全错过的东西?
更新:很多好的回应.感谢大家.我正在考虑我正在阅读的内容,我将通过每N次操作保存缓冲区以及当用户发出撤消命令重做来自最近保存的缓冲区的所有命令来解决此问题.我可以将N调整到尽可能高的值,这并不会显着降低需要响应式撤消的用户体验(为了最大限度地减少内存使用),但我怀疑此时并不确定,我应该是能够逃脱在一个框架中执行相当多的动作,这样做不是太糟糕.希望这种方法可以让我快速确定是否转向另一个方向,而不是为需要它的操作保存先前状态的位图rects.
Tyn*_*nam 10
首先,要注意过度设计:如果你的应用程序不复杂而且你的图像很小,你可能会发现"只是存储所有东西"是快速,便宜和可行的.但假设不是这样:
你是正确的,从每个撤消步骤1向前重绘整个画布是不可行的; 除非您的绘图程序非常简单,否则某些操作只需要太长时间.此外,可能不会调用无限的撤消缓冲区(并且可能非常耗费空间来存储).
如果您的艺术计划很复杂,我实际上是从混合方法开始,以处理各种操作.每隔一段时间保存帧缓冲区(你建议的每15-20个命令似乎没问题;我可能从10开始并在我工作后调整)并从上次保存开始前进.但是,不要让"每15个行动"的刚性,因为它很可能是拇指的一些额外的规则,将使它看起来更加流畅给用户.
例如,一些耗时或棘手的反向操作总是可以创建一个新的保存点:
- 任何画布调整大小(裁剪等)
- 任何保存.("我刚刚保存"是一个非常可能让用户撤回的地方.)
- 任何非常耗时的操作都应该在操作之后而不是之前创建一个新的保存点; 即它应标记下一个操作以保存缓冲区以撤消.(为什么?如果操作需要30秒,您不希望之后堆栈中的每个撤消都需要额外的30秒以上.)
- 相反,任何具有容易执行数学否定或自反转(如光阴性)的操作都不需要费心保存帧缓冲区,并且不应计入下一次保存.
所有这些都省去了层次的问题; 如果你的程序有它们,那么显然只保存那些改变的层.
绝对是我的最高优先级建议:无论使用何种方法,都应该始终为最近执行的操作保存帧缓冲区."哎呀,并不意味着"是撤销的最可能原因,所以你总是希望撤销一步做出回应.如果不是你保留的那个,你可以在下一个命令执行后丢弃这个缓冲区.
您还需要考虑什么构成一个原子撤消操作.(例如,使用单个画笔工具进行一次或多次操作的一组笔画?两者都有优点和缺点.)