ios - 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
}
}
解决方案
从评论来看,问题是在哪里进行性能时间测试。CoreImage
在测试过滤器时,我不能强调这一点:
使用真实设备,而不是模拟器。
我的经验是,在模拟器中它可能需要“几秒钟到几分钟”,而在任何使用 iOS 9+ 的 iPhone 5 或更高版本的设备中(可能更早,两种方式)都将是“接近实时到毫秒”。如果您没有在真实设备上看到这个?代码有问题。
我没有找到任何教程,任何书籍,任何强调这一点的东西。我最好的资源——Simon Gladman,他为 Swift 编写了出色的 Core Image(小心,它是 Swift 2)——解释了很多我认为正在发生的事情,但从未真正强调过为什么会这样。
iOS 设备使用 GPU。模拟器没有。
我敢肯定它比这更复杂,并且涉及优化。但事情是这样 - 虽然您可以使用 CoreImage macOS
,但如果您使用的是您的目标模拟器iOS
。因此,在使用 CoreImage 的 macOS 项目可能表现良好的情况下,如果它是 iOS 项目,则需要使用真实设备才能获得真实的性能感受。
推荐阅读
- postgresql - 在表格中单击事件时如何在地图上显示点的位置。我用烧瓶来调用事件&使用openlayers。谢谢
- vb.net - RestSharp.RestClient.Execute(RestSharp.RestRequest, Method.POST) 获取未设置为对象异常实例的对象引用
- flutter - FutureBuilder,没有为“对象”类型定义吸气剂“变量”
- google-chrome - 谷歌灯塔审计报告抛出错误:灯塔无法可靠地加载您请求的页面。(状态代码:404)
- mailjet - Mailjet 模板 - 当 var 中的值为(非)null 时的条件决策
- excel - 如果所有条件都不存在过滤选项,如何摆脱错误?
- typescript - TypeScript 可选泛型类型
- mysql - 使用 SELECT 查询 MySQL 全局变量
- python - 将 for 循环的输出存储在数组中
- javascript - 我可以使用 ChartJS 更改特定范围的填充背景颜色吗?