首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个使用金属显示相机输出的Xcode项目对电池有这么大的影响,我怎样才能使它更好?

为什么这个使用金属显示相机输出的Xcode项目对电池有这么大的影响,我怎样才能使它更好?
EN

Stack Overflow用户
提问于 2018-09-17 16:05:46
回答 1查看 218关注 0票数 0

我使用CoreImageHelpers作为使用金属通过相机显示实时过滤输出的基础。问题是,当我期望金属比更新一个UIImageView甚至OpenGL更好的时候,我会意外地得到高的电池冲击。

更新:用 我的分叉版本进行测试

在测试原始项目之前,一定要更新一些内容:

-In ImageView.swift,必须在commandBuffer.commit()之后调用commandBuffer.commit()

-Wrap DispatchQueue.main.async connection.videoOrientation in captureOutput:

代码语言:javascript
复制
    DispatchQueue.main.async{
        connection.videoOrientation = AVCaptureVideoOrientation(rawValue: UIApplication.shared.statusBarOrientation.rawValue)!

    }

我正在iPhone 6s Plus上进行测试,当在Debug中查看时,CICMYKHalftone效应会将电池的冲击提高到很高。

我认为使用此金属视图将极大地提高性能,但它似乎没有,即使运行在较低的帧速率25-30 fps。

有没有什么重要的东西会让电池的使用更好,就像其他实时相机效果应用程序?

更新

我添加的另一个性能更新是preferredFramesPerSecond的MTKView设置,我将其设置为30,因为默认情况下它每秒最多调用60次。我将此与更低的设备帧速率结合起来,以获得更好的性能和更少的电池冲击。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-17 18:10:32

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

第二,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()。这将有一个更多的延迟,但将避免试图绘制太频繁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52371816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档