gpt4 book ai didi

ios - 向数组添加 12 个 ARFrame 后 ARSCNView 卡住 (iOS/Swift)

转载 作者:搜寻专家 更新时间:2023-11-01 06:59:59 26 4
gpt4 key购买 nike

我在 ViewController.swift 中有一个 ARSCNView 并且我想将 ARFrames 保存到一个预先分配的数组中

func session(_ session: ARSession, didUpdate frame: ARFrame)

但是,在处理大约 11-13 个 ARFrames 之后,整个 ARSCNView 将通过使用卡住

self.ARFrames.append(frame)

奇怪的是 func session(_ session: ARSession, didFailWithError error: Error) 在此过程中没有调用,也没有报告任何其他错误,应用程序没有崩溃并且每个其他用户控件都工作正常,只有 ARSCNView 卡住并且不会调用 dippUdate 事件。类似于 ARSCNView freezes when adding 14 ARAnchor subclass objects with strong reference但是那里的页面没有解决方案。同样在应用程序进入后台并返回后,sessionWasInterrupted(:)sessionInterruptionEnded(:) 被调用,即使场景 View 之前被卡住。 这是 iOS 11 的错误吗?

这是我在我的应用中使用的完整代码。

import UIKit

class ViewController: UIViewController,ARSCNViewDelegate,ARSessionDelegate {
@IBOutlet var sceneView: ARSCNView!
let configuration = ARFaceTrackingConfiguration()
var ARFrames = [ARFrame]()
var imgCount = 0

override func viewDidLoad() {
super.viewDidLoad()
ARFrames.reserveCapacity(300)
sceneView.delegate = self
sceneView.session.delegate = self
sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
}

func session(_ session: ARSession, didUpdate frame: ARFrame) {
if (frame.capturedDepthData == nil || self.imgCount >= 300){
return
}
DispatchQueue.global().async {
self.ARFrames.append(frame)
self.imgCount += 1
}
}
}

最佳答案

每个 ARFrame 都包含一个直接来自相机捕获系统的视频帧(在其 capturedImage 属性中)。

捕获系统提供的每一帧都来自一个固定大小的内存池,捕获系统会在 session 继续时重复使用该池。如捕获中所述 docs :

If multiple sample buffers reference such pools of memory for too long, inputs will no longer be able to copy new samples into memory and those samples will be dropped.

If your application is causing samples to be dropped by retaining the provided CMSampleBuffer objects for too long, but it needs access to the sample data for a long period of time, consider copying the data into a new buffer and then releasing the sample buffer (if it was previously retained) so that the memory it references can be reused.

通过将您获得的所有 ARFrame 添加到一个数组中,您声称拥有(即保留)它们的像素缓冲区,并最终使捕获系统的内存不足以写入新帧。并且ARKit 需要连续的视频流,因此您的 AR session 会停止。

解决方案?不要捕获所有这些框架。仅将您需要的任何信息从每个帧复制到您自己的数据结构中。

关于ios - 向数组添加 12 个 ARFrame 后 ARSCNView 卡住 (iOS/Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51392963/

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