샘플과 함께 작업 한 후 이것은 실제로 매우 흥미로 웠습니다. 여기에있는 문제는 CVOpenGLESTextureCacheCreateTextureFromImage()
기능입니다. 당신이 녹색 질감을 얻을 때 콘솔에 보면 다음과 같은 기록되는 볼 수 있습니다 : (헤더에 따라,
오류
-6661 CVOpenGLESTextureCacheCreateTextureFromImage -6661에서을 현재이 새로운 기능에 대한 문서를 찾을 수있는 유일한 곳)은 kCVReturnInvalidArgument
오류입니다. 이 함수에 대한 인수 중 하나가 잘못된 것입니다.
여기서 문제가되는 것은 CVImageBufferRef
입니다. 이 텍스처 캐시 업데이트를 처리하는 블록이 처리되는 동안이 캐시가 할당 해제되거나 변경되는 것 같습니다.
나는이 문제를 해결하기 위해 몇 가지 방법을 시도해 보았고, this answer에 설명 된 것처럼 디스패치 큐와 디스패치 세마포어를 사용했고, 델리게이트가 여전히 주 스레드를 다시 호출하고 다음과 같은 작업을 수행했습니다. 이 오류를 수정하는 것 같다 비동기 블록에 전원을 전달 한 후, 메인 쓰레드에 CVImageBufferRef을 만들기가 가리키는 바이트를 고정하고 유지함으로써
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0)
{
return;
}
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
CFRetain(pixelBuffer);
dispatch_async(openGLESContextQueue, ^{
[EAGLContext setCurrentContext:_context];
// Rest of your processing
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
CFRelease(pixelBuffer);
dispatch_semaphore_signal(frameRenderingSemaphore);
});
}
. 이 수정을 보여주는 전체 프로젝트는 here에서 다운로드 할 수 있습니다.
나는 여기에 한 가지만 말해 주어야합니다. 이것은 당신에게 어떤 것도 나타나지 않습니다. GLCrameRipple 샘플을 설정하는 방법을 살펴보면 응용 프로그램에서 가장 무거운 작업 인 파급 효과 계산이 백그라운드 대기열에 이미 전달되었습니다. 또한 OpenGL ES에 카메라 데이터를 제공하기 위해 새로운 고속 업로드 경로를 사용하므로 주 스레드에서 실행될 때 병목 현상이 발생하지 않습니다.
듀얼 코어 iPhone 4S에서 프로파일 링 한 필자는이 샘플 애플리케이션의 스톡 버전과 백그라운드 대기열에서 프레임 업로드를 실행하는 수정 된 시스템간에 렌더링 속도 또는 CPU 사용량에 큰 차이가 없음을 확인했습니다. 여전히 진단하는 것은 흥미로운 문제였습니다.
앱이 고장 났을 때 어떤 오류가 발생합니까? –
무슨 뜻으로 이미지가 화면에 표시되어야합니까? 동일한 공유 그룹의 서로 다른 컨텍스트간에 명명 된 GL 리소스를 전달하기 위해 규칙을 따르고 있습니까 (즉, 이전에 플러시, 패스, 이후 플러시)? – Tommy