【发布时间】:2011-10-01 08:07:17
【问题描述】:
现在 Apple 已将 Core Image 框架移植到 iOS 5.0,我想知道:Core Image 是否足够快以将实时滤镜和效果应用于相机视频?
另外,学习 iOS 5.0 的 Core Image 框架的一个好的起点是什么?
【问题讨论】:
标签: iphone ios performance core-image
现在 Apple 已将 Core Image 框架移植到 iOS 5.0,我想知道:Core Image 是否足够快以将实时滤镜和效果应用于相机视频?
另外,学习 iOS 5.0 的 Core Image 框架的一个好的起点是什么?
【问题讨论】:
标签: iphone ios performance core-image
它将在 iPhone 4 及更高版本中几乎是实时的。 iPhone 3GS 会有点波涛汹涌。不推荐使用 iPhone 3 及更早版本。
【讨论】:
现在 Core Image 已经在 iOS 上推出了一段时间,我们可以谈谈一些硬性能数据。我创建了一个基准应用程序作为我的GPUImage 框架测试的一部分,并分析了基于 CPU 的原始过滤器、Core Image 过滤器和 GPUImage 过滤器与实时视频源的性能。以下是对来自 iPhone 摄像头的 640x480 视频帧应用单个伽马滤镜所需的时间(以毫秒为单位)(对于运行两种不同操作系统版本的两种不同硬件型号):
iPhone 4 (iOS 5) | iPhone 4S (iOS 6)
------------------------------------------------
CPU 458 ms (2.2 FPS) 183 ms (5.5 FPS)
Core Image 106 ms (6.7 FPS) 8.2 ms (122 FPS)
GPUImage 2.5 ms (400 FPS) 1.8 ms (555 FPS)
对于 Core Image,这意味着 iPhone 4 上的简单伽马滤镜最高可达到 9.4 FPS,但在 iPhone 4S 上则超过 60 FPS。这是您可以设置的最简单的 Core Image 过滤器案例,因此性能肯定会随着更复杂的操作而变化。这似乎表明 Core Image 无法在运行 iOS 5 的 iPhone 4 上以足够快的速度进行实时处理以匹配 iPhone 的摄像头速率,但从 iOS 6 开始,它处理视频的速度足以在 iPhone 4S 及更高版本上进行实时过滤.
这些基准的来源可以在my GitHub repository) 中找到,如果你想看看我从哪里得到这些数字的话。
我已经从我原来的答案中更新了这个答案,这对 Core Image 的性能太挑剔了。我用作比较基础的棕褐色调滤镜执行的操作与我自己的不同,因此它是一个糟糕的基准。 Core Image 滤镜的性能在 iOS 6 中也得到了显着提升,这使得它们的速度足以在 iPhone 4S 及更高版本上处理实时视频。此外,我还发现了几个案例,like large-radius blurs,Core Image 的性能明显优于我的 GPUImage 框架。
上一个答案,供后人参考:
与任何与性能相关的问题一样,答案将取决于您的过滤器的复杂性、被过滤的图像大小以及您运行的设备的性能特征。
因为 Core Image 在 Mac 上已经有一段时间了,我可以向您指出 Core Image Programming Guide 作为学习框架的资源。鉴于 NDA,我无法评论 iOS 特定的元素,但我强烈建议观看 WWDC 2011 Session 422 - Using Core Image on iOS 和 Mac OS X 的视频。
Core Image(大部分)使用 GPU 进行图像处理,因此您可以查看 OpenGL ES 2.0 着色器在现有设备上处理图像处理的速度有多快。我did some work in this area recently,发现 iPhone 4 可以使用简单的着色器对 480 x 320 的实时视频进行 60 FPS 处理。您可以在那里下载我的示例应用程序并尝试自定义着色器和/或视频输入大小来确定您的特定设备是否可以以适当的帧速率处理此处理。 Core Image 可能会增加一点开销,但它也对过滤器链的组织方式进行了一些巧妙的优化。
目前最慢的兼容设备是 iPhone 3G S 和第 3 代 iPod touch,但它们并不比 iPhone 4 慢多少。iPad 2 以其强大的片段处理能力将它们全部击败。
【讨论】:
恕我直言,自 iOS6.0 以来,Core Image 始终是您的首选。 您会喜欢一些不错的功能,例如:
_CIglContext = [CIContext contextWithEAGLContext:_glContext options:opts]; 这些都在 WWDC2012 session video, Core Image 部分提到。看看,也许你会在那里找到你的解决方案。
【讨论】: