我正在拍摄每一帧的快照,应用一个过滤器,并用过滤后的图像更新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,它们有很大的滞后。
发布于 2020-04-14 05:32:57
我也在寻找一种没有延迟的方法,但我至少能够通过手动将视图渲染到图像中来减少延迟:
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),因为对于我的目的来说,它似乎基本上没有延迟,但每当我试图将结果视图转换为UIImage时,它都是空白的。不管怎样,上面的方法为我减少了大约一半的延迟,所以你可能会有一些运气。
https://stackoverflow.com/questions/61051404
复制相似问题