Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS上绘制背景线程_Ios_Multithreading_Uikit_Core Graphics_Nsoperation - Fatal编程技术网

在iOS上绘制背景线程

在iOS上绘制背景线程,ios,multithreading,uikit,core-graphics,nsoperation,Ios,Multithreading,Uikit,Core Graphics,Nsoperation,我有一个具有一些非常复杂的绘图逻辑的视图(它是一个从GIS数据绘制的地图视图)。在主线程上绘制此图形会锁定UI并使应用程序无响应。我想将图形移动到背景线程,例如NSO操作 构建此结构的最佳方式是什么 我当前正在绘制一个非内存CGContext,然后将其转换为CGImageRef,并将其发送到主线程上的blit视图。不幸的是,这会占用大量内存,而且GPU加速似乎不再使用,因为它的速度要慢一些。是否有某种方法可以从背景线程直接绘制到视图?我知道UIKit不是多线程安全的,但在我绘图时,也许有某种方法

我有一个具有一些非常复杂的绘图逻辑的视图(它是一个从GIS数据绘制的地图视图)。在主线程上绘制此图形会锁定UI并使应用程序无响应。我想将图形移动到背景线程,例如NSO操作

构建此结构的最佳方式是什么

我当前正在绘制一个非内存CGContext,然后将其转换为CGImageRef,并将其发送到主线程上的blit视图。不幸的是,这会占用大量内存,而且GPU加速似乎不再使用,因为它的速度要慢一些。是否有某种方法可以从背景线程直接绘制到视图?我知道UIKit不是多线程安全的,但在我绘图时,也许有某种方法可以锁定视图?

超过iOS 4.0。您可能需要自己创建
CGContext
,但没有理由不能在后台线程上绘制


也就是说,大多数UIKit操作都不是。如果需要这样做,您可以始终在后台线程中进行准备,然后在需要时使用
performOnMainThread
。甚至还有
waitUntilDone
。也就是说,你应该使用
NSOperation
NSOperationQueue

显然,我在iPhone上从未遇到过这种情况,但在Mac电脑上,我曾经遇到过类似的问题

  • 用于委托脱机上下文的绘图活动
  • 尝试为当前nsrunlop添加计时器,并按定时间隔执行图形命令。应该是这样的
  • 这应该能奏效

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


    您提到的性能问题可能是由于其他原因造成的。尝试使用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]];
    }