iOS:重用 CGContextRef?

Posted

技术标签:

【中文标题】iOS:重用 CGContextRef?【英文标题】:iOS: reuse CGContextRef? 【发布时间】:2013-09-17 08:58:35 【问题描述】:

我需要根据从服务器接收到的数据来绘制线条,并且我试图避免每次收到新点时都重新绘制整个东西,所以我想到了:

    重复使用CGContextRef,只为新点画线,或者 使用UIMutablePath 并在路径中添加新的点线,然后描边路径

但是我发现了问题:

    重复使用CGContextRef 不起作用,为什么? (即我可以在drawRect 中使用UIGraphicsGetCurrentContext(),但我不能在方法之外保留和使用它) 重绘路径的效率是否不如使用CGContextRef重绘?

谢谢!

【问题讨论】:

【参考方案1】:

不要尝试重用通过UIGraphicsGetCurrentContext() 获得的图形上下文。它不受支持,会导致行为不稳定。

如果您因重复调用 drawRect 而遇到性能问题,那么您有两种策略可能会有所帮助:

    减少调用 setNeedsDisplay 的频率。如果网络数据快速进入,您可以在每次新数据进入时设置一个 NSTimer。让计时器在 0.5 秒或更长时间后触发(你会比我更了解什么是谨慎的)。如果在计时器触发之前有新数据进入,请重置计时器。如果计时器在没有新数据到达的情况下触发,则调用 setNeedsDisplay。这将限制绘图调用。

    如果您的绘图代码非常昂贵,您可以使用 UIGraphicsBeginImageContext 和 UIGraphicsEndImageContext 调用将其移动到后台线程,在这两者之间您可以进行绘图,然后将该上下文渲染到 UIImage 中,并通过完成块返回主队列。然后,您可以在 drawRect 中绘制该图像,或者将其用作 UIImageView 的图像属性。

【讨论】:

【参考方案2】:

您不能重用它的原因是因为您正在绘制一个在短时间内提交的缓冲区。到那时,添加任何更改都为时已晚。

根据接收到的点数和频率,重新创建整个路径的效率可能非常低。重绘可变路径相当便宜。因此,您可能应该在某处保存一个可变路径,并且每次向它添加一个点时,使用setNeedsDisplay 或其他任何东西来重绘。在您实际分析/测量它并证明它效率低下之前,不要担心这种方法的性能。

【讨论】:

以上是关于iOS:重用 CGContextRef?的主要内容,如果未能解决你的问题,请参考以下文章

iOS绘图CGContextRef详解

IOS用CGContextRef画各种图形(文字圆直线弧线矩形扇形椭圆三角形圆角矩形贝塞尔曲线图片)(转)

CGContextRef&CGMutablePathRef&UIBezierPath简单学习

iOS:更改自我的内容(UIImage)

IOS绘图的核心步骤

CGContextRef使用简要教程