代码之家  ›  专栏  ›  技术社区  ›  Chewie The Chorkie

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

  •  0
  • Chewie The Chorkie  · 技术社区  · 7 年前

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

    更新:测试 my forked version ,或

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

    -在ImageView.swift,draw()必须在commandBuffer.commit()

    -包裹DispatchQueue.main.async 周围connection.videoOrientation 捕获输出:

        DispatchQueue.main.async{
            connection.videoOrientation = AVCaptureVideoOrientation(rawValue: UIApplication.shared.statusBarOrientation.rawValue)!
    
        }
    

    我在iphone6splus上进行测试,当在Debug Navigator中查看时,CICMYKHalftone效应会将电池的冲击提升到很高的水平。

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

    更新

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Ken Thomases    7 年前

    draw() ),您应该设置视图的 isPaused 属性设置为true。如果不这样做,则视图在调用时和在内部计时器上都会自动绘制。

    renderImage() 绘制() 是倒置的。这个 image didSet 观察员不应呼叫 渲染() . 它应该叫 绘制() draw(_ rect: CGRect) 这是我们的工作 渲染() 绘制() ). (你可以选择 绘制(rect:CGRect) 渲染() 渲染()

    根据您的具体需要,您还可以设置 enableSetNeedsDisplay 形象 打电话 setNeedsDisplay() 绘制()