ios - 在 iPad 3 上渲染手绘上下文的最佳实践

标签 ios objective-c cocoa-touch ios6

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

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

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

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

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

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

最佳答案

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

优点:清晰地缩放和重绘图像的能力
缺点:无法进行像素完美删除

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

希望这些信息有所帮助。

关于ios - 在 iPad 3 上渲染手绘上下文的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15149451/

相关文章:

ios - 在 Interface Builder 中将 subview 添加到动态项时应用程序崩溃

ios - 在 iOS 上以编程方式访问应用程序的图标

ios - 检索存储在 childByAutoId() 引用中的特定 Firebase 数据 (Swift)

ios - UIScrollView 内的 UIStackView : how to center-align stack view/items?

ios - XCode 5 GM 链接器错误 : too many compact unwind infos in function anon for architecture i386

objective-c - 正在保存 [NSTextField stringValue]... 窗口关闭时变量会被清除吗?

ios - 如何使 UIButton 文本对齐中心?使用 IB

ios - AFNetworking 下载队列

iOS-iPhone 6 和 6 plus 的图像资源

ios - 为什么数组在附加元素后返回 nil?