核心图像GPU性能太慢

时间:2018-11-24 17:12:18

标签: ios swift core-image

我在玩Core Image Filters,遇到了一个奇怪的基准。 具有以下两个功能;顾名思义,一个在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

}

}

1 个答案:

答案 0 :(得分:1)

根据评论,问题在于进行性能时间测试的位置。测试[ 4, 4, 4 ]过滤器时,我对此压力不足:

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

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

我没有发现任何强调这一点的教程,任何书籍或任何东西。我最好的资源-Simon Gladman撰写了出色的 Swift核心映像(请注意,它是Swift 2)-解释了我相信正在发生的很多事情,但从未真正强调过为什么会这样

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

我确信它要复杂得多,并且涉及优化。事实是这样的-尽管您可以在CoreImage中使用CoreImage,但如果您使用的是模拟器,则目标是macOS。因此,在使用CoreImage的macOS项目可能表现良好的地方,如果是iOS项目,则需要使用真实的设备来获得真实的性能感觉。