2013-05-11 29 views
2

我建立一个摄谱仪想知道我怎么能提高我UIView基于代码的性能。我知道我无法从后台线程更新iPhone/iPad的用户界面,所以我正在使用GCD进行大部分处理。我遇到的问题是我的界面仍然更新太慢。使用后台更新接口更快的方式线程

使用下面的代码,我试图采取32个堆叠的4x4像素UIView s并更改其背景颜色(请参阅附加图像上的绿色方块)。该操作会为其他用户界面产生可见的滞后。

有没有一种方法可以让我“准备”这些从某种后台线程的颜色,然后问主线程刷新界面一下子?

enter image description here

//create a color intensity map used to color pixels 
static dispatch_once_t onceToken; 
dispatch_once(&onceToken, ^{ 
    colorMap = [[NSMutableDictionary alloc] initWithCapacity:128]; 

    for(int i = 0; i<128; i ++) 
    { 
     [colorMap setObject:[UIColor colorWithHue:0.2 saturation:1 brightness:i/128.0 alpha:1] forKey:[NSNumber numberWithInt:i]]; 
    } 


}); 

-(void)updateLayoutFromMainThread:(id)sender 
{ 
    for(UIView* tempView in self.markerViews) 
    { 
     tempView.backgroundColor =[colorMap objectForKey:[NSNumber numberWithInt:arc4random()%128]]; 
    } 

} 
//called from background, would do heavy processing and fourier transforms 
-(void)updateLayout 
{ 

    //update the interface from the main thread 
    [self performSelectorOnMainThread:@selector(updateLayoutFromMainThread:) withObject:nil waitUntilDone:NO]; 


} 

我结束了预先计算的256个色的字典,然后问字典基于该圆正试图显示该值的颜色。尝试在飞行中分配颜色是瓶颈。

+6

所以你基准测试您的应用程序,这竟然是瓶颈,对不对? – 2013-05-11 11:23:19

+1

您表示您的视图已堆叠。你的意思是只有其中一个是可见的?如果是的话,该解决方案可能会推迟对除了下一个视图以外的不可见视图的所有操作(或者如果您的用户可以通过各个视图快速切换,那么接下来的几个视图)。 WWDC 2012有一个视频,涉及构建并发用户界面。 – Paul 2013-05-11 13:36:53

+0

非常多我有256列每个有32个UIViews(4px乘4px)。通过堆叠我的意思是它们以4个像素为增量占用128个像素。每200ms左右我想做快速傅立叶变换,并使用这些视图对产生的频率进行颜色编码(简单地改变它们的背景颜色)。 – 2013-05-11 15:53:30

回答

1

,是的,几个百分点。

虽然你不应该在主线程处理的UIView,您可以使用它们之前实例在后台线程的意见。不知道这是否会帮助你。然而,除了在后台线程上实例化视图之外,UIView实际上只是CALayer对象的元数据包装器,并针对灵活性而非性能进行了优化。

最好的办法是在背景线程(这是一个较慢的过程,因为绘图使用CPU以及GPU)绘制图层对象或图像对象,将图层对象或图像传递到主线程,然后绘制预渲染的图像视图的层(更快,因为一个简单的调用,以获得图形处理器直接位块传输图像到了UIView的后备存储)。

看到这样的回答:

Render to bitmap then blit to screen

代码:

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextDrawImage(context, rect, image); 
} 

执行远远比如果你要执行其他绘图操作,如绘制贝塞尔曲线,在相同的方法快。

+0

不认为这有助于..他正在接近整个事情错误IMO – 2013-05-11 15:56:30

+0

用视图控制器管理CAlayers取代unviews显着加快了性能,因为我可以在后台执行所有处理,然后用预先计算的颜色填充一堆或多个矩形 – 2013-05-15 00:05:57