ios - 使用后台线程更新界面的更快方法

标签 ios performance cocoa-touch graphics uiview

我正在构建一个光谱仪,想知道如何提高基于 UIView 的代码的性能。我知道我无法从后台线程更新 iPhone/iPad 的用户界面,所以我使用 GCD 进行大部分处理。我遇到的问题是我的界面更新速度仍然太慢。

使用下面的代码,我尝试采用 32 个堆叠的 4x4 像素 UIView 并更改它们的背景颜色(请参见附图中的绿色方 block )。该操作会为其他用户界面产生明显的滞后。

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

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 种颜色的字典,然后根据圆试图显示的值向字典询问颜色。试图动态分配颜色是瓶颈。

最佳答案

,是的,有几点。

虽然您不应该在主线程上处理 UIView,但您可以在使用它们之前在后台线程上实例化 View 。不确定这是否对您有帮助。然而,除了在后台线程上实例化 View 之外,UIView 实际上只是 CALayer 对象的元数据包装器,并且针对灵 active 而不是性能进行了优化。

最好的办法是在后台线程上绘制图层对象或图像对象(这是一个较慢的过程,因为绘图使用 CPU 和 GPU),将图层对象或图像传递给主线程,然后将预渲染的图像绘制到您的 View 层(速度要快得多,因为只需调用一个简单的调用即可让图形处理器将图像直接 blit 到 UIView 的后备存储)。

看到这个答案:

Render to bitmap then blit to screen

代码:

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

执行速度比您在同一方法中执行其他绘图操作(例如绘制贝塞尔曲线)要快得多。

关于ios - 使用后台线程更新界面的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16496548/

相关文章:

java - 使用标志或 if 子句效率更高吗?

objective-c - 设置无处不在 :itemAtURL:destinationURL:error: does not remove the item from iCloud

ios - Facebook自定义登录按钮swift 3 : bug

ios - 如何在 iOS 中创建这个自定义 UI

ios - 将 iPhone 6 plus 定位到 iPad 应用

ios - 是否可以通过编程方式获取 WKInterfaceGroup 的子元素?

java - 检查字母是否大写的更快方法(性能)?

java - 用于性能指标存储的开源技术

ios - 如何在 iPhone 应用程序中记录所有用户的触摸

ios - UITextView 从文本的底部或中间开始