在iOS上的后台线程中绘图

我有一个非常复杂的绘图逻辑视图(它是一个从GIS数据中提取的地图视图)。 在主线程上执行此绘图会锁定UI并使应用程序无响应。 我想将绘图移到背景线程,例如NSOperation。

构建这个的最佳方法是什么?

我目前正在绘制一个关闭内存的CGContext,然后将其转换为CGImageRef,我将其发送到视图以在主线程上进行blit。 不幸的是,这会占用大量内存,似乎不再使用GPU加速,因为它的速度要慢得多。 有没有办法从后台线程直接绘制到视图? 我知道UIKit不是multithreading安全的,但是在我进行绘图时可能有某种方法可以锁定视图?

我从未在iPhone上遇到过这样的情况,但在Mac上我遇到过类似的问题。

  1. 使用CGLayer委派脱机上下文的绘图活动。
  2. 尝试为当前NSRunLoop添加计时器,并按照定时间隔执行图形命令。 应该看起来像这样……

kRenderFPS 25.0 //This is Maximum value renderTimer = [[NSTimer timerWithTimeInterval:(1.0 / (NSTimeInterval)kRenderFPS) target:viewobject selector:@selector(RenderUI:) userInfo:nil repeats:YES] retain]; [[NSRunLoop currentRunLoop] addTimer:renderTimer forMode:NSDefaultRunLoopMode]; [[NSRunLoop currentRunLoop] addTimer:renderTimer forMode:NSModalPanelRunLoopMode]; [[NSRunLoop currentRunLoop] addTimer:renderTimer forMode:NSEventTrackingRunLoopMode]; //In view class -(void)RenderUI:(id)param { [self setNeedsDisplayInRect:[self bounds]]; } 

这应该可以解决问题。

还尝试对您的流程进行采样,并检查谁在消耗CPU。 这将使UI响应迅速。

您提到的性能问题可能是由于其他原因造成的。 尝试cpu示例流程。 它将让您了解谁实际上正在使用CPU。

在iOS 4.0之外, 绘图是线程安全的 。 您可能需要自己创建CGContext ,但没有理由不能在后台线程上绘制。

也就是说,大多数UIKit的运营都没有。 如果需要这样做,可以随后在后台线程中进行准备,然后在需要时使用performOnMainThread 。 甚至还有waitUntilDone 。 也就是说,显然你应该使用NSOperationNSOperationQueue