2015-06-15 2 views
0

Я действительно застрял с некоторыми недостатками CALayer.CALayer ведет себя по-разному при создании заново при применении CATransform3dIdentity

У меня есть слой, который знает, как нарисовать стрелу.

Я применяю какое-то преобразование на каждом кадре на нем.

Но он работает только так, как ожидается, если я всегда создаю этот слой с нуля и применим преобразование. И это не работает, если я пытаюсь повторно использовать один и тот же старый слой (применяя свойство CATransform3dIdentity). Через «он не работает» я имею в виду, что он мерцает на экране, и преобразование не применяется по мере необходимости по сравнению с преобразованием, применяемым к вновь созданному слою.

Мой код выглядит следующим образом:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 
{ 
    transformModel = [OverlayTransformExtractor transformFromPixelBuffer:sampleBuffer]; 

    if(transformModel) 
    { 
     //I tried also not removing it every time but just transforming.. the effect is the same 
     [firstLayer removeFromSuperlayer]; 

     if(!firstLayer) 
     { 
      firstLayer = [VNArrowLayer layer]; 

      firstLayer.frame = CGRectMake(videoView.frame.origin.x, videoView.frame.origin.y, videoView.frame.size.width, videoView.frame.size.height); 
      originalTransform = firstLayer.transform; 
     } 

     //resetting the previous transforms 
     firstLayer.transform = CATransform3DIdentity; 

     [self applyTransform:transformModel.transform]; 

     dispatch_async(dispatch_get_main_queue(), ^(void) 
     { 
      [arrowView.layer addSublayer:firstLayer]; 

      [CATransaction begin]; 
      [CATransaction setValue:(id)kCFBooleanTrue 
          forKey:kCATransactionDisableActions]; 
      [firstLayer setNeedsDisplay]; 
      [CATransaction commit]; 

     }); 
    } 
    else 
    { 
     dispatch_async(dispatch_get_main_queue(),^
     { 
      [firstLayer removeFromSuperlayer]; 
      [secondLayer removeFromSuperlayer]; 
     }); 
    } 
} 

Некоторые предложения о почему он ведет себя по-другому, когда он только что создали? Я проверил преобразование таким же. Я даже попытался установить то же положение, что и новый слой (0,0), но он еще более странный (он остается в левом верхнем углу)

Я также подумал, что, возможно, это из-за неявной анимации, поэтому я попытался отключить его -> никаких изменений.

Добавление нового слоя каждый раз неприемлемо. Память заполняется довольно быстро, хотя я вручную пытаюсь установить первый слой на нуль.

ответ

0

Как указано выше, когда я применял преобразование к существующему слою (на каждом кадре), он мерцал. При создании его в каждом кадре он был идеальным, но интенсивным.

я не мог получить то, что делает его мерцают, возможно, некоторые ограничения или макета вещи, о которых я не могу найти какую-либо информацию, но ..

мне удалось сделать подход (новый слой в каждой рамке) работы. Идея заключалась в том, что я удалял старый слой и присваивал ему нить не в основном потоке, из-за чего деллалокации происходили позже и таким образом, чтобы быстро заполнить мою память.

Итак, решение состоит в том, чтобы удалить старый слой, создать новый и применить преобразование в основном потоке.

Если smb может дать ответ, который объясняет мерцание, я буду рад отметить его как правильный.