我正在为手机编写一个绘画/图形 Java 应用程序(因此内存有限)。应用程序状态本质上是三个 1000x500 位图(即绘画的图层)。加载三个位图大约需要 2 或 3 秒。
我正在尝试编写一个撤消引擎,但我无法找到一个好的方法来做到这一点。典型的方法是:
使用命令模式:当您撤消时,您会重新加载初始文件的状态,然后播放迄今为止处理的所有命令(最后一个命令除外)。但天真地这样做意味着等待 2 或 3 秒来加载初始状态,这太慢了。也没有足够的内存来存储内存中的初始状态。
使用备忘录模式:当您撤消时,您将用旧状态替换当前状态中已更改的部分。这意味着每个操作都需要将旧状态的位图保存到磁盘,因为移动设备上没有足够的内存来将其存储在内存中。由于保存位图需要时间,如果用户决定例如,我该如何应对?快速连续地绘制许多笔触?我不能让他们等待。
我的所有解决方案都涉及上述模式的复杂混合。
任何人都可以建议一个解决方案,使我能够对我的应用程序进行相当快速的撤消/重做吗?
还有第三种常见的处理撤消的方法。也就是将两种状态之间的差异存储在Undo对象内。您可以将其作为实际差异(即哪些像素已更改以及它们更改为什么)来执行此操作,但这可能几乎与在每个阶段存储位图一样浪费内存。
或者,您可以使用命令模式方法,但不是在撤消时重新运行命令,而是存储命令的逆命令 - 即,如果用户将红色值增加十,则撤消命令会将其减少十。要撤消,只需执行相反的命令即可。有些命令很难找到相反的命令,例如“转换为黑白”,但是通过将底层位图与许多由命令打开或关闭的过滤器混合,您可能可以做到这一点。
作为另一个建议,使用您提到的命令方法,但保留上一步的位图。当用户执行撤消操作时,立即显示上一 (n-1) 步骤中缓存的位图,然后开始计算 n-2 的位图,以便您为他再次按下撤消操作做好准备。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)