我目前有一个免费的手绘iPad应用程序,它通过触摸方法中的四条曲线在可变路径中添加线条,然后在新区域调用setNeedsDisplayInRect。
问题是当绘图(路径)变得相当大时,重绘需要更长时间,并开始陷入困境。除了用户更改画笔大小或颜色外,它还会将其应用于重绘时先前绘制的路径的重叠部分。
为了解决这个问题,我在touchesEnded中的后台线程中调用renderInContext,并将其与绘制视图后面的imageview中的另一个UIImage合并。然后清除绘制视图。
这也有助于当用户点击保存时,绘图通常已经在单个UIImage中呈现 - 准备好了。
这在其他设备上运行良好,但在iPad 3视网膜显示器上,性能非常糟糕,并且当用户快速绘制时多次抬起手指时往往会崩溃。
我正在寻求任何类型的建议,以便在处理此类情况时采用最佳做法?除了添加额外的视图以在背景中渲染以防止主要和后台线程一次访问相同的视图 - 这听起来相当黑客 - 我觉得我打败了一匹死马?
答案 0 :(得分:4)
在我目前的应用程序中,无论路径长度或路径数量如何,我都在iPad 2和3上都能正常工作。看起来图形卡在绘制大量小路径然后是几条大路径方面更好,而且任何一条路径都比将图像渲染到上下文中更快。所以,我所做的就是即使用户不断绘图,我也会将路径分成许多较小的路径并将其添加到数组中。这种方法给了我一个优点,一个缺点。
优点:能够清晰地缩放和重绘图像 缺点:不能做像素完美擦除
就多种颜色而言,我创建了一个包含颜色属性的UIBezierPath
子类。由于颜色现在可以通过NSCoding
进行序列化,因此它们很容易保存。另外,我有一个“笔画”对象,它保存用户在一个连续笔画中创建的所有路径。这样我就可以正确处理撤消/重做。
希望此信息有所帮助。