我正在拍摄每一帧的快照,应用过滤器,并使用过滤后的图像更新 ARSCNView 的背景内容。一切正常,但屏幕上的所有 UI 元素都有很多延迟。 ARSCNView 上没有延迟。
func session(_ session: ARSession, didUpdate frame: ARFrame) {
guard let image = CIImage(image: sceneView.snapshot()) else { return }
// I'm setting a filter to each image here. Which has no effect on the latency.
sceneView.scene.background.contents = context.createCGImage(image, from: image.extent)
}
我知道我可以使用
frame.capturedImage
,这使得延迟消失。但是,我还在屏幕上放置了 AR 对象 frame.capturedImage
出于某种原因忽略,sceneView.scene.background.contents
无法重置为其原始来源。所以,我无法关闭图像过滤器。这就是为什么我需要拍摄快照。我能做些什么来减少 UI 元素的延迟吗?我在屏幕上有一些 UIScrollViews 有很大的滞后。
最佳答案
我也在寻找一种没有延迟的方法,但我至少能够通过手动将 View 渲染为图像来减少延迟:
extension ARSCNView {
/// Performs screen snapshot manually, seems faster than built in snapshot() function, but still somewhat noticeable
var snapshot: UIImage? {
let renderer = UIGraphicsImageRenderer(size: self.bounds.size)
let image = renderer.image(actions: { context in
self.drawHierarchy(in: self.bounds, afterScreenUpdates: true)
})
return image
}
}
令人沮丧的是,这比内置快照功能更快,但它似乎是,并且仍然捕获快照中的所有 SceneKit 图形。 (不过,每帧都这样做仍然很昂贵,仅供引用,唯一真正的解决方案可能是自定义金属着色器。)
我也在尝试使用
ARSCNView.snapshotView(afterScreenUpdates: Bool)
因为对于我的目的而言,这似乎基本上没有滞后,但是每当我尝试将生成的 View 转换为 UIImage 时,它都是完全空白的。无论哪种方式,上述方法对我来说将延迟减少了大约一半,所以你可能会有一些运气。
关于ios - ARSCNView snapshot() 导致延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61051404/