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开发常见问题及解决方案