ios - ARSCNView snapshot() 导致延迟

标签 ios swift latency arscnview

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

相关文章:

iphone - 有关于如何在 Mac/PC 和 iOS 之间使用 iTunes 文件共享传输图片的教程吗?

ios - NSXMLParser 应用终止 "unrecognized selector sent to instance"

swift - subview 大小问题 - xib 中与 UIView 相关的大小调整

使用泛型类时 Swift 抛出运行时错误

c# - 改善 Azure 网站到 Azure VM 的网络延迟

Windows Azure 网站延迟

ios - GPUImageMovieWriter - 录制视频两端偶尔出现黑帧

ios - NSStream.close() 是同步的 TCP 吗?

ios - 当后台请求完成时通知 swift

javascript - 将 angularjs Controller 拉出到不同的文件中时,如果我的模块没有首先加载怎么办?