首页 > 解决方案 > Core Image GPU 性能太慢

问题描述

我在玩 Core Image Filters 并遇到了一个奇怪的基准。具有以下2个功能;顾名思义,一个在 cpu 上处理重数学,另一个在 gpu 上处理,cpu 性能比 gpu 性能快大约一百倍。我尝试了“CILineOverlay”和“CIPhotoEffectProcess”过滤器,并用DispatchTime.now()方法测量了转换时间。难道我做错了什么?还是与不推荐使用的 opengl 支持有关?

private func apply_cpu(to image:UIImage?, appleFilterName:String) -> UIImage?    {

    guard let image = image, let cgimg = image.cgImage else {
        return nil
    }

    let coreImage = CIImage(cgImage: cgimg)

    let filter = CIFilter(name: "CISepiaTone")
    filter?.setValue(coreImage, forKey: kCIInputImageKey)
    filter?.setValue(0.5, forKey: kCIInputIntensityKey)

    if let output = filter?.value(forKey: kCIOutputImageKey) as? CIImage {
        return UIImage(ciImage: output)
    }

    else {
        return nil
    }
}


private func apply_gpu(to image:UIImage?, appleFilterName:String)-> UIImage?  {

    guard let image = image, let cgimg = image.cgImage else {

        return nil
    }


    let coreImage = CIImage(cgImage: cgimg)


    let start = DispatchTime.now()

    let openGLContext = EAGLContext(api: .openGLES3)
    let context = CIContext(eaglContext: openGLContext!) 


    guard let filter = CIFilter(name: appleFilterName)   else {
        return nil
    }

    if  filter.inputKeys.contains(kCIInputImageKey) {
        filter.setValue(coreImage, forKey: kCIInputImageKey)
    }

    if  filter.inputKeys.contains(kCIInputIntensityKey) {


    }


    if let output = filter.value(forKey: kCIOutputImageKey) as? CIImage {
        let cgimgresult = context.createCGImage(output, from: output.extent)
        return UIImage(cgImage: cgimgresult!)

    }

        return nil

}

}

标签: iosswiftcore-image

解决方案


从评论来看,问题是在哪里进行性能时间测试。CoreImage在测试过滤器时,我不能强调这一点:

使用真实设备,而不是模拟器。

我的经验是,在模拟器中它可能需要“几秒钟到几分钟”,而在任何使用 iOS 9+ 的 iPhone 5 或更高版本的设备中(可能更早,两种方式)都将是“接近实时到毫秒”。如果您没有在真实设备上看到这个?代码有问题

我没有找到任何教程,任何书籍,任何强调这一点的东西。我最好的资源——Simon Gladman,他为 Swift 编写了出色的 Core Image(小心,它是 Swift 2)——解释了很多我认为正在发生的事情,但从未真正强调过为什么会这样。

iOS 设备使用 GPU。模拟器没有

我敢肯定它比这更复杂,并且涉及优化。但事情是这样 - 虽然您可以使用 CoreImage macOS,但如果您使用的是您的目标模拟器iOS。因此,在使用 CoreImage 的 macOS 项目可能表现良好的情况下,如果它是 iOS 项目,则需要使用真实设备才能获得真实的性能感受。


推荐阅读