什么是实现"撤消"的最佳方法。照片编辑应用程序的功能?

时间:2017-04-04 19:21:56

标签: java undo undo-redo

显然,需要大量内存才能存储一系列变更历史......这就是我的应用程序如何工作但看起来似乎还有更聪明的方法来实现这一目标

ArrayList<Photo> photoHistory = new ArrayList<>();
photoHistory.add(originalPhoto);
photoHistory.add(change1);
photoHistory.add(change2);

// bad implementation - lots of memory

也许只存储原始视图模型和当前视图模型并记录所使用的方法/过滤器?然后当用户点击“撤消”时它会花费所做的更改总数并再次通过所有更改减去一个?这似乎也非常低效。

我想我只是在寻找有关如何实施一般&#39;撤消&#39;软件应用程序的功能。

1 个答案:

答案 0 :(得分:2)

以下是GIMP如何实现它的提示:

  

GIMP的Undo实现相当复杂。许多操作只需要非常少的撤消内存(例如,更改图层的可见性),因此您可以在撤消撤消历史记录之前执行它们的长序列。某些操作(例如更改图层可见性)会被压缩,因此连续多次执行这些操作只会在“撤消历史记录”中生成一个点。但是,还有其他操作可能会消耗大量的撤消内存。大多数过滤器都是由插件实现的,因此GIMP核心没有有效的方法来了解更改的内容。因此,除了通过在操作之前和之后存储受影响的层的全部内容之外,无法实现撤消。您可能只能在退出撤消历史记录之前执行一些此类操作。

Source

因此,尽可能以最佳方式进行,您必须根据正在撤消的操作执行不同的操作。显示或隐藏图层可以用可忽略的空间量表示,但是过滤整个图像可能需要存储整个图像的另一个副本。但是,如果您只过滤部分图像(或在图像的一小部分中绘制),则可能只需要存储该部分图像。