1

I need to draw lines based on data received from a server, and I tried to avoid redrawing the whole thing every time I receive a new point, so I thought about:

  1. Re-use CGContextRef and only draw line for new point, or
  2. Use UIMutablePath and add new line of point to the path, then stroke the path

But I found the problem:

  1. Re-use CGContextRef does not work, why ? (ie I can UIGraphicsGetCurrentContext() in drawRect but I cannot keep and use it outside the method)
  2. Is redrawing the path as less efficient as redrawing using CGContextRef?

Thanks!

4

2 回答 2

2

不要尝试重用通过UIGraphicsGetCurrentContext(). 它不受支持,会导致不稳定的行为。

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

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

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

于 2013-09-17T18:17:48.030 回答
1

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

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

于 2013-09-17T18:15:41.340 回答