2016-10-19 4 views
0

CIContext, CIDetector 및 CIImage를 사용하여 captureOutput : didOutputSampleBuffer : fromConnection :의 샘플에서 파생 된 vImage_Buffer의 사각형을 감지합니다. 탐지기 또는 CIImage가 메모리를 보유하고있어 방출 될 수없는 것으로 보입니다. 여기에 문제의 코드 -이 코드를 통해 건너 뛰는 메모리는 응용 프로그램 충돌 할 때까지 그렇지 증가에 일정하게 유지 보여줍니다 :AVCaptureOutput 메모리 누수가있는 CIImage 및 CIDetector 사용

// ...rotatedBuf and format managed outside scope 

// Use a CIDetector to find any potential subslices to process 
CVPixelBufferRef cvBuffer; 
vImageCVImageFormatRef cvFormat = vImageCVImageFormat_CreateWithCVPixelBuffer(pixelBuffer); 
CVPixelBufferCreate(kCFAllocatorSystemDefault, rotatedBuf.width, rotatedBuf.height, kCVPixelFormatType_32BGRA, NULL, &cvBuffer); 
CVPixelBufferLockBaseAddress(cvBuffer, kCVPixelBufferLock_ReadOnly); 
err = vImageBuffer_CopyToCVPixelBuffer(&rotatedBuf, &format, cvBuffer, cvFormat, NULL, kvImageNoFlags); 
CVPixelBufferUnlockBaseAddress(cvBuffer, kCVPixelBufferLock_ReadOnly); 
if (![self vImageDidError:err]) { 
    CIImage *ciImage = [CIImage imageWithCVPixelBuffer:cvBuffer]; 
    NSArray *feats = [self.ciDetector featuresInImage:ciImage options:nil]; 
    if (feats && [feats count]) { 
     for (CIFeature *feat in feats) { 
      // The frame is currently in image space, so we must convert it to a unitless space like the other rects. 
      CGRect frame = feat.bounds; 
      CGRect clip = CGRectMake(frame.origin.x/rotatedBuf.width, frame.origin.y/rotatedBuf.height, 
             frame.size.width/rotatedBuf.width, frame.size.height/rotatedBuf.height); 
      rects = [rects arrayByAddingObject:[NSValue valueWithCGRect:clip]]; 
     } 
    } 
} 
CVPixelBufferRelease(cvBuffer); 
vImageCVImageFormat_Release(cvFormat); 

다른 답변 오토 릴리즈 풀에 포장이나 제안이 각 프레임을 새로운 CIDector을 만들 것을, 메모리 사용에는 영향을주지 않습니다.

CIDetector isn't releasing memory

CIDetector won't release memory - swift

편집 : dispatch_main_queue 이외의 다른 하나는 메모리 문제를 클리어 한 듯하고, UI 응답 성 유지에 파견 큐를 전환.

+0

매우 비슷한 질문이지만 다른 대답이 필요하다고 생각합니다. 내가 겪고있는 문제는 동일한 증상을 보이지만 다른 원인이 있다고 생각합니다. 비록 그것이 다른 질문이든간에 그것은 당신에게 달렸습니다! – schellsan

+0

글쎄, 나는 다른 해결책을 알아 냈다. 나의 경우에는 메인 처리 대기열에서 모든 처리를하고 있었다. 처리를 실행할 새 대기열을 만드는 상황을 수정했습니다. 내 CPU 시간의 대부분이 featuresInImage : 호출에 소비 된 경우 일 수 있습니다 실현했습니다. 그것은 메모리 문제를 일으킨 원인을 설명하지는 않지만, 백그라운드 스레드 메모리에서 실행 중이므로 멋지고 상수입니다. – schellsan

+1

자, 질문을 다시 열어 답변으로 드릴 수 있습니다. – matt

답변

0

다른 솔루션을 찾아 냈습니다. 제 경우에는 기본 처리 대기열에서 모든 처리를 실행하고있었습니다. 처리를 실행할 새 대기열을 만드는 상황을 수정했습니다. 내 CPU 시간의 대부분이 featuresInImage : options :에 대한 호출에 소비 된 경우 일 수 있습니다. 메모리 문제의 원인을 설명하지는 않지만 별도의 큐에서 실행 중이므로 메모리가 좋고 일정합니다.