【发布时间】:2011-03-15 08:38:55
【问题描述】:
我正在尝试为 iphone 制作一个类似于画笔或图层或 Photoshop 精简版的位图编辑器应用程序。如果可能的话,我希望能够支持大约 4 层的 1000x1000 分辨率图像。
我正在尝试在编写太多代码之前设计我的撤消/重做系统,但由于移动设备的限制以及位图编辑器操作通常是破坏性的。我所知道的最常见的撤消/重做设计是:
使用命令模式。您存储初始状态和用于将其转换为当前状态的命令。要撤消,您需要重新加载初始状态并重播除最后一个命令之外的所有命令。
使用备忘录模式。每次操作后,您都会存储足够的信息以恢复该操作。
我预见的问题是:
命令模式:在 500 次编辑操作后我想撤消最后一次怎么办?加载初始状态并应用 499 可能会很耗时,特别是如果其中一些是昂贵的东西,例如应用模糊滤镜。我不喜欢在不同场景下撤消花费不同时间的方式。
备忘录模式:保存已修改的位图部分会占用大量内存。将这些位图缓存到磁盘也可能很慢(因此,如果用户进行大量快速编辑,我可能无法缓存位图)并且我不确定电池使用量的影响。
我能想到的唯一解决方案是:
使用命令模式和备忘录模式,每 10 条左右的命令或在昂贵的操作之后,还会保存整个状态(它为您提供免费的自动保存功能)。要撤消,我重新加载最近的快照,然后重播命令。不过,我宁愿避免这种复杂性。
使用备忘录模式并强制用户等待位图被缓存。如果我将这个时间构建到例如,这还不错。等待过滤器应用,但在画笔描边之间效果不佳。
是建议吗?我很想知道一些现有的应用程序是如何做到这一点的。
我能想到上述各种奇怪的混合体,但它们都有明显的问题。我能想到的就是解决其中的一些问题或妥协应用程序以使问题更简单(例如减小最大位图大小的大小)。我注意到一些应用程序的最大位图大小和图层限制非常低。
【问题讨论】:
-
+1:很高兴看到如此深入调查(和书面)的问题!欢迎来到 StackOverflow,Radent :-)
-
谢谢,您可能会说这个问题现在让我发疯了。 :-)
-
你测量过缓存位图需要多长时间吗?
-
快速实验大约需要 0.5 - 1 秒。只要在下一个操作完成时缓存完成,一切都OK。但是,我的主要问题是如果例如会发生什么。用户非常快速地点击屏幕 5 次,每次点击都是您想要撤消的一项操作。我要么需要强制用户等待,要么将 5 个操作合并为 1 个操作(即撤消将撤消 1 秒的操作),要么设置一些系统以高效内存的方式在后台缓存每个操作。不过,我为后者提供的所有解决方案都非常复杂。
-
@Mau:我很确定他们使用的是混合方法。他们有一个撤消命令树,但我认为它们也在昂贵的操作之后存储状态。但是在桌面上要容易得多,因为我可以轻松地将 X 许多撤消层保留在内存中,并根据需要将它们保存到磁盘。在移动设备上,我很幸运能够拥有 2 个全尺寸的撤消层。嗯,看起来我将不得不针对常见情况进行优化,并接受不太常见的情况下的不良性能。
标签: iphone objective-c algorithm design-patterns optimization