2014-11-30 1 views
0

체인에서 GPUImageFilter를 사용하고 있으며 대부분 정상적으로 작동합니다. 나는 최근에이 증상의 일치하는 몇 가지 임의의 충돌을 발견했습니다 (GPUImageFilter를 사용하고 있지는 않지만 캡처 또는 비디오를 라이브로 사용하고 있음에도 불구하고). willResignActive에서 프레임 버퍼 및 다른 GPUImage 관련 작업을 지울 수있는 적절한 방법을 찾으려고합니다. GPUImage GPUImageFilter를 사용하여 gpus_ReturnNotPermittedKillClient 크래시

현재 내가 가진 :

[[GPUImageContext sharedFramebufferCache] purgeAllUnassignedFramebuffers]; 

이 충분합니까? 나는 대신 다른 것을 사용해야합니까?

답변

0

거기에 표시된 것처럼 스택 추적에서 gpus_ReturnNotPermittedKillClient을 보면 거의 항상 응용 프로그램이 백그라운드에 있거나 백그라운드로 가려고하는 중에 OpenGL ES 작업이 수행되기 때문입니다.

이 문제를 해결하려면 응용 프로그램을 백그라운드로 시작하기 전에 모든 GPUImage 관련 작업을 완료해야합니다. 응용 프로그램이 백그라운드를 향하고 있다는 위임 통지를 수신하고 위임 콜백이 종료되기 전에 모든 처리가 완료되었는지 확인해야합니다. 헤닝 (henryl)의 제안은이를 보장하는 한 가지 방법입니다. 대리자 콜백의 끝 부분에 다음을 추가합니다

runSynchronouslyOnVideoProcessingQueue(^{ 
    // Do some operation 
}); 

은 무슨 할 것 것은 (배경 대기열에서 실행) 비디오 프로세싱 파이프 라인에 동기 블록을 삽입합니다. 델리게이트 콜백은이 블록이 실행될 때까지 그 시점의 주 스레드를 차단하여 완료되기 전에 모든 처리 블록을 보장합니다. 그러면 응용 프로그램이 백그라운드로 이동하기 전에 보류중인 모든 작업이 완료됩니다 (새 작업을 추가하지 않는다고 가정).

응용 프로그램에 교착 상태가 발생할 수있는 약간의 기회가 있지만 처리 파이프 라인의 코드가 메인 큐에 다시 호출되지 않는다고 생각합니다. 당신은 그것을 조심하고 싶을 것입니다. 왜냐하면 만약 내가 거기에 아직도 뭔가를 가지고 있다면, 이것은 당신의 어플리케이션을 잠글 것이기 때문입니다. 그렇다면 내부 코드를 수정해야합니다.

+0

위대한 Brad, 감사합니다. 이 동기 블록 내에서 수행 할 작업에 대한 제안 사항은 무엇입니까? 아니면 빈칸으로두면 처리 대기열 끝에 빈 호출이 삽입됩니까? – brandonscript

+0

@remus - 나는 아무것도 남기지 않고 여전히 작동 할 것이라고 생각하지만 컴파일러가 최적화하지 않았는지 확인해야 할 수도 있습니다. 어쩌면 의미없는 계산을 할 수 있습니다. henryl이 제안하는'glFinish()'는 OpenGL ES 컨텍스트가 실행되는 특정 스레드에 연결되지 않은 경우 충돌을 일으킬 수 있기 때문에 완전히 안전하지 않습니다. –

+0

굉장 - 오늘 밤에 이걸 시험해 볼거야. 감사! – brandonscript