我使用CoreImageHelpers作为使用金属通过相机显示实时过滤输出的基础。问题是,当我期望金属比更新一个UIImageView甚至OpenGL更好的时候,我会意外地得到高的电池冲击。
更新:用 我的分叉版本或进行测试
在测试原始项目之前,一定要更新一些内容:
-In ImageView.swift,必须在commandBuffer.commit()之后调用commandBuffer.commit()
-Wrap DispatchQueue.main.async connection.videoOrientation in captureOutput:
DispatchQueue.main.async{
connection.videoOrientation = AVCaptureVideoOrientation(rawValue: UIApplication.shared.statusBarOrientation.rawValue)!
}我正在iPhone 6s Plus上进行测试,当在Debug中查看时,CICMYKHalftone效应会将电池的冲击提高到很高。
我认为使用此金属视图将极大地提高性能,但它似乎没有,即使运行在较低的帧速率25-30 fps。
有没有什么重要的东西会让电池的使用更好,就像其他实时相机效果应用程序?
更新:
我添加的另一个性能更新是preferredFramesPerSecond的MTKView设置,我将其设置为30,因为默认情况下它每秒最多调用60次。我将此与更低的设备帧速率结合起来,以获得更好的性能和更少的电池冲击。
发布于 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()。这将有一个更多的延迟,但将避免试图绘制太频繁。
https://stackoverflow.com/questions/52371816
复制相似问题