在iOS上绘制背景线程
我有一个具有一些非常复杂的绘图逻辑的视图(它是一个从GIS数据绘制的地图视图)。在主线程上绘制此图形会锁定UI并使应用程序无响应。我想将图形移动到背景线程,例如NSO操作 构建此结构的最佳方式是什么 我当前正在绘制一个非内存CGContext,然后将其转换为CGImageRef,并将其发送到主线程上的blit视图。不幸的是,这会占用大量内存,而且GPU加速似乎不再使用,因为它的速度要慢一些。是否有某种方法可以从背景线程直接绘制到视图?我知道UIKit不是多线程安全的,但在我绘图时,也许有某种方法可以锁定视图?超过iOS 4.0。您可能需要自己创建在iOS上绘制背景线程,ios,multithreading,uikit,core-graphics,nsoperation,Ios,Multithreading,Uikit,Core Graphics,Nsoperation,我有一个具有一些非常复杂的绘图逻辑的视图(它是一个从GIS数据绘制的地图视图)。在主线程上绘制此图形会锁定UI并使应用程序无响应。我想将图形移动到背景线程,例如NSO操作 构建此结构的最佳方式是什么 我当前正在绘制一个非内存CGContext,然后将其转换为CGImageRef,并将其发送到主线程上的blit视图。不幸的是,这会占用大量内存,而且GPU加速似乎不再使用,因为它的速度要慢一些。是否有某种方法可以从背景线程直接绘制到视图?我知道UIKit不是多线程安全的,但在我绘图时,也许有某种方法
CGContext
,但没有理由不能在后台线程上绘制
也就是说,大多数UIKit操作都不是。如果需要这样做,您可以始终在后台线程中进行准备,然后在需要时使用
performOnMainThread
。甚至还有waitUntilDone
。也就是说,你应该使用NSOperation
和NSOperationQueue
。显然,我在iPhone上从未遇到过这种情况,但在Mac电脑上,我曾经遇到过类似的问题
您提到的性能问题可能是由于其他原因造成的。尝试使用cpu示例进程。它将让您了解谁实际占用了CPU。No.CGLayer。所以我现在正在尝试这种方法,但即使我使用NSTimer运行,并且只运行50%的时间(以0.2秒的间隔运行,每个绘图周期最多0.1秒),它似乎仍然忽略所有UI事件。这有什么诀窍吗?你试过哪种风格?CGLayer或nsrunlop或两者?使用CGLayer委派屏幕外绘图,使用NSRunloop按时间间隔执行绘图命令。我注意到有人对我的答案投了反对票,但没有解释为什么为-1。这并不酷。我同时使用了CGLayer和nsrunlop。现在我正在尝试使用NSOperation的CGLayer(即在后台线程上)。不过,我在后台线程上的表现非常糟糕。(尽管用户界面现在已经响应了。)关于这一点似乎有很多困惑,但这是正确的答案,因为在iOS 4.0中,使用UIKit绘制是线程安全的。这是官方发布的消息:(搜索“线程”)。
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]];
}