【发布时间】:2023-03-26 23:35:01
【问题描述】:
我使用CoreImageHelpers 作为使用 Metal 的基础,通过摄像头显示实时过滤输出。问题是,当我期望 Metal 的性能比更新 UIImageView 甚至 OpenGL 好得多时,我意外地受到了高电池影响。
更新:使用my forked version 进行测试,或者
在测试原始项目之前,请务必更新以下内容:
-在ImageView.swift中,draw()必须在commitBuffer.commit()之后调用
-在 captureOutput 中围绕 connection.videoOrientation 包装 DispatchQueue.main.async:
DispatchQueue.main.async{
connection.videoOrientation = AVCaptureVideoOrientation(rawValue: UIApplication.shared.statusBarOrientation.rawValue)!
}
我在 iPhone 6s Plus 上进行测试,在 Debug Navigator 中查看时,一个 CICMYKHalftone 效果会将电池影响提高到高。
我认为使用此 Metal 视图会极大地提高性能,但似乎并没有,即使以 25-30 fps 的较低帧速率运行。
是否缺少任何重要的东西可以像其他实时相机效果应用一样提高电池使用率?
更新:
我添加的另一个性能更新是 MTKView 的 PreferredFramesPerSecond 设置,我将其设置为 30,因为默认情况下它每秒最多调用 60 次。我将此与较低的设备帧速率相结合,以实现更好的性能和更少的电池影响。
【问题讨论】:
-
为什么你希望 Metal 比更新 UIImageView 或使用 OpenGL 更快? CPU 和 GPU 上的工作负载对于所有这些都是相同的。 Metal 的开销比 OpenGL 少,但如果您使用 Metal,GPU 的计算能力和内存带宽不会神奇地改变。 (如果 Metal 的性能比 UIImageView 或 OpenGL 差得多,那当然是出了问题。)
-
由于我使用 CIFilters 过滤图像,因此有必要在从像素缓冲区获取图像后立即创建 CIImage。实现 Metal 可以让我更快地将图像渲染到视图上,而无需先转换为 CGImage。 Metal 比 OpenGL 更优化,我已经比较了影响。这与性能无关,更多的是关于电池的影响。
标签: swift performance camera metal battery