核心图像 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 项目,您需要使用真实设备来获得真实的性能感受。
我在玩 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 项目,您需要使用真实设备来获得真实的性能感受。