2

我正在拍摄每一帧的快照,应用过滤器,并使用过滤后的图像更新 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 有很大的滞后。

4

1 回答 1

0

我也在寻找一种没有延迟的方法,但我至少能够通过手动将视图渲染为图像来减少延迟:

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 时,它​​都是完全空白的。无论哪种方式,上述方法对我来说将延迟减少了大约一半,所以你可能会有一些运气。

于 2020-04-13T21:32:57.460 回答