首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS:重用CGContextRef?

iOS:重用CGContextRef?
EN

Stack Overflow用户
提问于 2013-09-17 08:58:35
回答 2查看 1.3K关注 0票数 1

我需要根据从服务器接收到的数据绘制线,而且每次收到新的点时,我都尽量避免重新绘制整件事情,所以我想:

  1. 重用CGContextRef,并仅为新点绘制线,或
  2. 使用UIMutablePath并向路径添加新的点行,然后划出路径

,但我发现了问题:

  1. 重用CGContextRef不起作用,为什么?(即我可以在UIGraphicsGetCurrentContext()中使用drawRect,但不能在方法之外保存和使用它)
  2. 重绘路径的效率低于使用CGContextRef重绘的效率。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-17 18:17:48

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

如果重复调用drawRect导致性能问题,那么有两种策略可能会有所帮助:

  1. 减少调用setNeedsDisplay的频率。如果网络数据迅速进入,您可以在每次新数据进入时设置一个NSTimer。比如说,在0.5秒或更长的时间内使用计时器(你会比我更清楚什么是谨慎的)。如果新数据在计时器启动之前传入,请重置定时器。如果计时器在未到达新数据的情况下触发,则调用setNeedsDisplay。这将抑制绘图呼叫。
  2. 如果绘图代码非常昂贵,则可以使用UIGraphicsBeginImageContext和UIGraphicsEndImageContext调用将其移动到后台线程,在此之间可以执行绘图,然后将该上下文呈现为UIImage,并通过完成块将UIImage传递回主队列。然后,您可以在drawRect中绘制该图像,也可以将其用作UIImageView的图像属性。
票数 2
EN

Stack Overflow用户

发布于 2013-09-17 18:15:41

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18845462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档