代码之家  ›  专栏  ›  技术社区  ›  Andy Jazz

如何在iOS应用程序中显著降低能耗影响?

  •  -1
  • Andy Jazz  · 技术社区  · 6 年前

    我正在开发一个具有Vision框架功能的ARKit应用程序(处理CoreML模型)。

    loopCoreMLUpdate() 函数生成一个循环,该循环导致 超高能量冲击 (CPU=70%,GPU=66%)。

    如何处理这项任务并将能源影响降低到较低水平 ?

    这个循环问题的解决方法是什么,可以帮助我减少CPU/GPU工作负载 ?

    这是我的密码:

    import UIKit
    import SpriteKit
    import ARKit
    import Vision
    
    class ViewController: UIViewController, ARSKViewDelegate {
    
        @IBOutlet weak var sceneView: ARSKView!
        let dispatchQueueML = DispatchQueue(label: "AI")
        var visionRequests = [VNRequest]()
    
        // .........................................
        // .........................................
    
        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
            let configuration = AROrientationTrackingConfiguration()
            sceneView.session.run(configuration)
    
            loopCoreMLUpdate()
        }
    
        func loopCoreMLUpdate() {          
            dispatchQueueML.async {
                self.loopCoreMLUpdate()  // SELF-LOOP LEADS TO A VERY HIGH IMPACT
                self.updateCoreML()
            }
        }
    
        func updateCoreML() {
            let piBuffer: CVPixelBuffer? = (sceneView.session.currentFrame?.capturedImage)
            if piBuffer == nil { return }
            let ciImage = CIImage(cvPixelBuffer: piBuffer!)
            let imageRequestHandler = VNImageRequestHandler(ciImage: ciImage, options: [:])
    
            do {
                try imageRequestHandler.perform(self.visionRequests)
            } catch {
                print(error)
            }
        }
        // .........................................
        // .........................................
    }
    
    1 回复  |  直到 4 年前
        1
  •  2
  •   Rob Napier    6 年前

    如果要捕获帧,则不需要创建紧密循环来对其进行采样。您将自己设置为ARSessionDelegate并实现 session(_:didUpdate:)

    请记住,您将很快收到很多帧。30fps或60fps是非常常见的,但它可以高达120fps。您不能使用所有的时间片(其他东西也需要处理器时间)。关键是,您通常无法跟上帧速率,或者需要为以后的处理进行缓冲,或者丢弃帧,或者两者兼而有之。这是实时处理的一个非常正常的部分。

    对于这种分类系统,您可能希望选择实际帧速率,可能低至10-20fps,并跳过帧以保持该速率。对几十个几乎相同的帧进行分类可能没有帮助。

    Recognizing Objects in Live Capture . 感觉这就是您正在尝试做的,并且有很好的示例代码可供使用。