1

我目前有一个免费的手绘 iPad 应用程序,它通过 touches 方法中的四边形曲线将线条添加到可变路径,然后在新区域上调用 setNeedsDisplayInRect。

问题是当绘图(路径)变得相当大时,重绘需要更长的时间,并开始陷入困境。以及每当用户更改画笔大小或颜色时,它都会在重绘时将其应用于先前绘制的路径的重叠部分。

为了解决这个问题,我在 touchesEnded 的后台线程中调用 renderInContext,并将它与绘图视图后面的 imageview 中的另一个 UIImage 合并。然后清除绘图视图。

这也有帮助,因此当用户点击保存时,绘图通常已经在单个 UIImage 中呈现 - 准备就绪。

这在其他设备上运行良好,但在 iPad 3 视网膜显示屏上,性能非常糟糕,并且当用户在快速绘图时多次抬起手指时往往会崩溃。

我正在寻求有关处理此类情况的最佳实践的任何类型的建议?除了添加额外的视图以在后台渲染以防止主线程和后台线程一次访问相同的视图 - 这听起来相当 hack-ish - 我觉得我正在打败一匹死马?

4

1 回答 1

4

在我当前的应用程序中,我制作了一个在 iPad 2 和 3 上都能正常工作的实现,无论路径长度或路径数量如何。似乎显卡更擅长绘制大量小路径而不是几条大路径,并且任何一个都比将图像渲染到上下文中更快。所以,我所做的是即使用户不断地绘制,我也会将路径分成许多较小的路径并将它们添加到数组中。这种方法给了我一个优点和一个缺点。

优点:能够清晰地缩放和重绘图像
缺点:不能进行像素完美擦除

至于多种颜色,我创建了一个UIBezierPath包含颜色属性的子类。由于颜色现在可以通过 序列化NSCoding,因此它们很容易保存。此外,我有一个“笔划”对象,它包含用户在一个连续笔划中创建的所有路径。这样我就可以正确处理撤消/重做。

希望这些信息有所帮助。

于 2013-03-01T03:16:12.577 回答