gpt4 book ai didi

swift - 为什么这个使用 Metal 显示相机输出的 Xcode 项目对电池有如此大的影响,我怎样才能让它变得更好?

转载 作者:行者123 更新时间:2023-11-28 14:13:08 25 4
gpt4 key购买 nike

我正在使用 CoreImageHelpers作为使用 Metal 通过相机显示实时过滤输出的基础。问题是当我期望 Metal 的性能比更新 UIImageView 甚至 OpenGL 好得多时,我意外地受到了高电池影响。

更新:使用 my forked version 进行测试, 或者

在测试原始项目之前,请务必更新一些内容:

-在ImageView.swift中,draw()必须在commandBuffer.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 view 会极大地提高性能,但它似乎并没有,即使以 25-30 fps 的较低帧速率运行也是如此。

是否有任何重要的缺失可以像其他实时相机效果应用一样提高电池使用率?

更新:

我添加的另一个性能更新是 MTKView 的 preferredFramesPerSecond 设置,我将其设置为 30,因为默认情况下它每秒最多调用 60 次。我将其与较低的设备帧速率相结合,以实现更好的性能和更少的电池影响。

最佳答案

首先,由于您手动驱动绘图(通过调用 draw()),您应该将 View 的 isPaused 属性设置为 true。如果您不这样做, View 将在您调用它时和在内部计时器上自行绘制。

其次,renderImage()draw()的关系颠倒了。 image didSet 观察者不应调用 renderImage()。它应该调用 draw()。您应该重写 draw(_ rect: CGRect) 来完成 renderImage() 的工作(减去对 draw() 的调用) ). (您可以让 draw(_ rect: CGRect) 调用 renderImage() 或者您可以简单地将 renderImage() 重命名为 draw (_ rect: CGRect).)

根据您的具体需要,您还可以将 enableSetNeedsDisplay 设置为 true 并更改 image didSet 以调用 setNeedsDisplay() 而不是 draw()。这会有更多的延迟,但会避免过于频繁地尝试绘制。

关于swift - 为什么这个使用 Metal 显示相机输出的 Xcode 项目对电池有如此大的影响,我怎样才能让它变得更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52371816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com