2013-03-21 2 views
1

iOS6에서는 OpenGL을 사용하여 AVFoundation 비디오 프레임에서 일부 렌더링을 수행합니다. CVPixelBufferLockBaseAddress와 CVPixelBufferUnlockBaseAddress를 사용하는 많은 예제 코드를 보았습니다.하지만 정확하게 잠금 및 잠금 해제를 수행 할 때 또는 내가 왜 그렇게하는지 명확하지 않습니다. CPU가 메모리를 수정할 때 주소를 잠글까요? 아니면 GPU가 읽고있을 때 잠글 수 있습니까? 잠금을 해제해야하는시기는 언제입니까? 내가 왜 자물쇠를 풀고 싶었 을까? 나는 this Stack Overflow answer을 보았지만 내 질문에는 완전히 대답하지 않습니다.언제 CVPixelBufferLockBaseAddress 및 CVPixelBufferUnlockBaseAddress를 호출해야합니까?

+0

그건 내가 내에서 귀하의 질문에 연결된 비슷한 질문 및 나의 대답 http://stackoverflow.com/questions/6468535/cvpixelbufferlockbaseaddress-why-capture-still-image-using-avfoundation – Andrea

+0

봐. 내가 말했듯이, 그것은 내 질문에 완전히 대답하지 않습니다. 그러나 아마도 당신은 약간의 통찰력을 가지고있을 것입니다. 잠글 때가 언제입니까? 잠금을 해제해야하는시기는 언제입니까? 왜 잠금을 해제해야합니까? 자물쇠는 무엇을 방해합니까? – GingerBreadMane

답변

3

필요할 때마다 잠금을 설정하고 완료되면 더 이상 잠금을 해제하지 않아야합니다. 이렇게하면 버퍼가 겹쳐 쓰여지지 않아 일관성없는 상태가 될 수 있습니다.

펌웨어 전문가가이 설명을 들었습니다. 일반적으로 비디오 출력을 처리 할 때 포인터가있는 간접적 인 참조가 많다는 것을 명심해야합니다. "이봐, 내 꺼야, 어딘가에 다음 프레임을 가리 킵니다. "

버퍼가 더 이상 필요하지 않을 때 응용 프로그램을 기반으로 말할 수는 없지만 알아낼 수 있어야합니다. 버퍼 데이터를 다른 곳으로 복사 한 경우 (예 : 새 객체를 만드는 경우) 잠금을 해제 할 수 있습니다.

희망이 도움이됩니다.

2

CPU의 픽셀 버퍼에 액세스하려는 경우에만이 함수를 호출해야합니다. GPU의 경우 그러지 마십시오! Apple 의사는 매우 명확합니다. 여기

공식 사과 문서의 정보입니다 :

https://developer.apple.com/library/prerelease/ios/documentation/QuartzCore/Reference/CVPixelBufferRef/index.html#//apple_ref/c/func/CVPixelBufferLockBaseAddress

당신은 CPU와 픽셀 데이터를 액세스하기 전에 CVPixelBufferLockBaseAddress 함수를 호출하고, 이후에 CVPixelBufferUnlockBaseAddress 함수를 호출해야합니다. 버퍼를 잠글 때 lockFlags 매개 변수에 kCVPixelBufferLock_ReadOnly 값을 포함 시키면 버퍼를 잠금 해제 할 때 kCVPixelBufferLock_ReadOnly 값도 포함시켜야합니다.

는 GPU으로 화소 데이터에 액세스 중요

는 로크가 필요하지 않고 성능을 손상시킬 수있다.

관련 문제