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います。これにより、レイテンシが解消されます。frame.capturedImageしかし、何らかの理由で無視sceneView.scene.background.contentsされ、元のソースにリセットできないARオブジェクトも画面に配置します。そのため、画像フィルターをオフにすることはできません。そのため、スナップショットを撮る必要があります。

UI 要素の待ち時間を短縮するためにできることはありますか? 画面にいくつかのUIScrollViewがあり、非常に遅れがあります。

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)私の目的には本質的に遅れがないように見えるので、私も作業しようとしていますが、結果のビューを UIImage に変換しようとすると、完全に空白になります。いずれにせよ、上記の方法でラグが約半分に短縮されたので、運がよかったかもしれません。

于 2020-04-13T21:32:57.460 に答える