核心图像 GPU 性能太慢

Core Image GPU performance too slow

我在玩 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

}

}

根据评论,问题出在进行性能时间测试的地方。在测试 CoreImage 个过滤器时我怎么强调都不为过:

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

我的经验是,它可以在模拟器中使用 "seconds to minutes",而在任何使用 iOS 9+ 的 iPhone 5 或更高版本的设备中(也可能更早,两种方式) "near real-time to milliseconds"。如果您没有在真实设备上看到这个?代码中有问题。

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

iOS 设备使用 GPU。模拟器 不会

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