【问题标题】:Why is GPUImage slower than CPU calculation when calculating average color of image?为什么 GPUImage 在计算图像的平均颜色时比 CPU 计算慢?
【发布时间】:2017-02-27 15:59:13
【问题描述】:

在我的项目中,我试图获得一系列UIImage 对象的平均颜色。所以我实现了一个类别UIImage(AverageColor)来计算平均颜色。

这是我使用 GPUImage 库的方法:

- (void)averageColor:(void (^)(UIColor *))handler {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        GPUImagePicture *picture = [[GPUImagePicture alloc] initWithImage:self];
        GPUImageAverageColor *averageColorFilter = [GPUImageAverageColor new];
        [averageColorFilter setColorAverageProcessingFinishedBlock:^(CGFloat r, CGFloat g, CGFloat b, CGFloat a, CMTime frameTime) {
            UIColor *color = [UIColor colorWithRed:r green:g blue:b alpha:a];
            dispatch_async(dispatch_get_main_queue(), ^{
                handler(color);
            });
        }];
    
        [picture addTarget:averageColorFilter];
        [picture useNextFrameForImageCapture];
        [picture processImage];
    });
}

我也尝试过this answer 中的方法(我认为是纯 CPU 吗?)。然后我用相同的UIImage 测试这两种方法,并注销每种方法使用的时间。结果如下:

cpu时间:0.102402

显卡时间:0.414044

我很惊讶 CPU 运行得更快。那么这里有什么问题呢?我是否以错误的方式使用GPUImage


编辑:

以上结果来自iOS模拟器。在真机(iPhone6s)上进行测试时,差异更大:

cpu时间:0.019034

显卡时间:0.137635

【问题讨论】:

    标签: ios cocoa-touch uiimage core-graphics gpuimage


    【解决方案1】:

    不是颜色平均速度很慢,而是因为从 UIImage 创建 GPUImagePicture 的开销很大。从 UIImage 实例化 GPUImagePicture 当前需要通过 Core Graphics 将该图像重新渲染为纹理并将其上传到 GPU。

    这是一个缓慢的过程,如果可以的话,我建议您创建一次 GPUImagePicture 并重复使用它,或者完全避免处理 UIImages(直接从相机中抓取,使用原始字节等)。我一直致力于在框架内将 JPEG 和 PNG 图像直接解码为原始字节以避免这种情况,但没有太多时间来完成。

    至于颜色平均本身,它通常会大大超过原始的逐像素计算,但可能有一些方法可以改进这一点。有关此问题的更多讨论,请参阅 my answer here 和后续的 cmets。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-03
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多