Сохранение снимка ARSCNView в методе didUpdateFrame приводит к зависанию камеры

Я создаю видео в ARKit во время сеанса. Когда я нажимаю кнопку записи, камера зависает. Я написал код в делегате didUpdateFrame, который вызывает проблему. Там я сохраняю scene.snapshot в виде массива. Также, когда я создаю видео из этих изображений, приложение вылетает со следующим сообщением в отладчике: Сообщение от отладчика: завершено из-за проблемы с памятью

    -(void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame
    {
     if (_recordButton.state  == UIControlStateSelected)
     {
      currentState = Recording;
     [self saveImage];
    }
    else if (previousState == Recording)
    {
    NSLog(@"Stop recording");
    currentState = NotRecording;
    recordTime = NULL;
    self.nextButton.enabled=YES;
   }
//update recording state per frame update
previousState = currentState;

}

    -(void)saveImage 
    {
      UIImage *image = self.sceneView.snapshot;
      [self.bufferArray addObject:image];
      image = nil;
   }

person Mudassir    schedule 24.07.2017    source источник
comment
Приостановите отладчик внутри didUpdateFrame и проверьте трассировку стека — есть большая вероятность, что вы находитесь внутри цикла рендеринга представления, поэтому, если вы запускаете снимок, вы можете запускать другой рендеринг, который снова вызовет ваш didUpdateFrame, и так далее. до тех пор, пока не произойдет сбой из-за бесконечной рекурсии. Самое простое решение, вероятно, состоит в том, чтобы асинхронно отправить снимок в основную очередь.   -  person rickster    schedule 24.07.2017
comment
Я также проверил асинхронную отправку, но ничего не произошло. dispatch_async(dispatch_get_main_queue(), ^{ UIImage *image = self.sceneView.snapshot; NSData *compressImageData = UIImageJPEGRepresentation(image, 0.02); UIImage *compessImage = [UIImage imageWithData: compressImageData]; [self.bufferArray addObject:compessImage]; compessImage = ноль; изображение = ноль; });   -  person Mudassir    schedule 25.07.2017


Ответы (1)


Не используйте ARSCNView.snapshot с реализацией ARSessionDelegate.didUpdateFrame. У меня была такая же проблема, и решение было не реализовывать ARSessionDelegate.didUpdateFrame. Я использовал CADisplayLink с ARSCNView.snapshot, и он работает хорошо. Я также пытался использовать ARFrame.capturedImage, но он вообще не содержит объектов AR. ARSCNView.snapshot содержит их.

person poGUIst    schedule 11.08.2017
comment
Вы когда-нибудь выясняли, как содержать объекты AR с помощью ARFrame.capturedImage? У меня возникла эта проблема. - person Joe; 04.04.2020
comment
Нет, в этот момент я забыл ARKit, как кошмар 8) - person poGUIst; 22.04.2020