Снимок ARSCNView () вызывает задержку - PullRequest
1 голос
/ 06 апреля 2020

Я делаю снимок каждого кадра, применяю фильтр и обновляю фоновое содержимое ARSCNView с помощью отфильтрованного изображения. Все работает нормально, но все элементы пользовательского интерфейса на экране сильно задерживаются. Нет задержки в 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, что устраняет задержку go. Однако я также размещаю объекты AR на экране, который frame.capturedImage по какой-то причине игнорирует, и sceneView.scene.background.contents не может быть сброшен к исходному источнику. Поэтому я не могу отключить фильтр изображений. Вот почему мне нужно сделать снимок.

Могу ли я что-нибудь сделать, чтобы уменьшить задержку для элементов пользовательского интерфейса? У меня есть несколько UIScrollViews на экране, которые имеют огромное отставание.

1 Ответ

0 голосов
/ 14 апреля 2020

Я также нахожусь в процессе поиска способа сделать это без задержки, но я смог по крайней мере уменьшить задержку путем рендеринга вида в изображение вручную:

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, оно полностью пустое. В любом случае, вышеописанный метод сократил для меня отставание примерно вдвое, так что вам может повезти с этим.

...