ARKit ARSCNView.snapshot() 内存泄漏

Posted

技术标签:

【中文标题】ARKit ARSCNView.snapshot() 内存泄漏【英文标题】:ARKit ARSCNView.snapshot() memory leak 【发布时间】:2018-07-18 08:42:11 【问题描述】:

我正在使用 ARKit。我需要将相机中的视图保存到相册中。所以我在情节提要中添加了一个按钮,以及如下功能:

@IBAction func saveScreenshot() 
    let snapShot = self.sceneView.snapshot()
    UIImageWriteToSavedPhotosAlbum(snapShot, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)


@objc func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) 
    // ...

但是当我多次单击按钮时,我的应用程序崩溃了。所以我转到“Debug Navigator”,单击按钮后,内存增加了大约 30M(比如 200M - 235M - 260M ~~~~ 500M+)。

发生了什么?那我该怎么办?

【问题讨论】:

我也遇到这个问题,有解决办法吗? @MayuriRTalaviya 还没有。 【参考方案1】:

我在 Scenekit 中遇到了同样的问题(仅在 ios12 上;相同的构建在 iOS11 上运行良好)。现在我找到了一个解决方法:我没有使用 SCNView 的 snapshot() 方法,而是使用 SCNRenderer 的 snapshot(atTime:with:antialiasingMode:) 方法。这需要一些额外的工作:

    创建渲染器对象, 将其场景属性设置为要渲染的场景, 对齐场景pointOfView。

我已经更换了我的 let snapShot = scenView.snapShot

以下 4 行(注意:我没有动画,所以 TimeInterval(0) 对我来说没问题):

let renderer = SCNRenderer(device: MTLCreateSystemDefaultDevice(), options: [:]) renderer.scene = scene renderer.pointOfView = sceneView.pointOfView let snapShot = renderer.snapshot(atTime: TimeInterval(0), with: size, antialiasingMode: .none)

【讨论】:

【参考方案2】:

我遇到了这个问题,但是发现在主线程上调用快照方法可以解决内存泄漏。

【讨论】:

以上是关于ARKit ARSCNView.snapshot() 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

ARKit从入门到精通(11)-ARKit开发常见问题及解决方案

ARKit从入门到精通-ARKit捕捉平地

通过 Swift 设置 ARKit 方向

ARFoundation入门到精通 - 1.3 ARkit 支持机型

ARKit:ARFrame.timestamp 代表啥?

ARKit从入门到精通(10)-ARKit让飞机绕着你飞起来