首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARSCNView快照()导致延迟

ARSCNView快照()导致延迟
EN

Stack Overflow用户
提问于 2020-04-06 08:47:50
回答 1查看 177关注 0票数 2

我正在拍摄每一帧的快照,应用一个过滤器,并用过滤后的图像更新ARSCNView的背景内容。一切都很好,但屏幕上的所有UI元素都有很大的延迟。ARSCNView没有延迟。

代码语言:javascript
复制
 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,它们有很大的滞后。

EN

回答 1

Stack Overflow用户

发布于 2020-04-14 05:32:57

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

代码语言:javascript
复制
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时,它都是空白的。不管怎样,上面的方法为我减少了大约一半的延迟,所以你可能会有一些运气。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61051404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档