我应该如何保存iOS用户操作以平衡性能和提供多次撤消



我在应用程序的一个视图上有手指绘画的东西。当用户触摸视图时,我会保存当前视图图像,以便以后在必要时撤消它。为了减少延迟,我使用大中央调度(类似)来启动它

TouchesBegan method...
dispatch_async(dispatch_get_main_queue(), ^{
    [self saveCurrentState];
});

对于这个saveCurrentState,我尝试了不同的方法,即将映像保存到磁盘、核心数据或内存中的映像。最后一种方法效果最好,但它会使内存使用量翻倍,并使应用程序因内存使用而崩溃。前两种方法(保存到磁盘或核心数据)会产生很大的滞后,以至于如果用户连续快速地在移除和触摸屏幕时画几行,有些线将不会画出来,因为程序正忙于保存一个图像,而保存另一个图像的命令到达。

我曾尝试创建一个串行队列,或者使用GCD的3个主队列中的一个,使用高优先级,但结果总是一样的。

我该如何解决?最好的方法是什么?

谢谢。

每次编辑图像时是否需要将其保存到磁盘?也许你可以备份用户的操作并保存这些操作。类似于:

Line(12, 24, 500, 24)

在这方面可以即兴发挥的一种方法是使用瓦片。因此,在每一点上,您只保存自上次写入以来更改的磁贴。这样,你就不会写太多必要的东西,而且你可能会减少写出来的数据量,因为用户不太可能涵盖绘图板的大部分内容。

因此,在写出上次迭代中更改的瓦片后,将所有瓦片标记为干净。当用户与板交互时,将已更改的瓷砖标记为脏瓷砖。用户完成操作后,在并发队列中写出所有脏瓦片。重复一遍。

当瓦片发生变化时,您必须保留一些元数据,以便在给定的迭代中重建电路板,从而支持撤消/重做操作。

或者,您可以通过在重要时刻(如每5-10次操作)保存图像来改进路径方法,这样撤消/重做就不会那么昂贵,写入也不会那么昂贵。

最新更新