2010-12-29 4 views
6

내 OpenGL-ES 1.1 기반 응용 프로그램에서 OpenGL 텍스처 소스로 CALayer을 사용하고 있습니다. 그 CALayerCGImage과 CoreGraphics를 통해 렌더링 된 텍스트로 구성됩니다. 다른 OpenGL 텍스처 소스는 -[CALAyer renderInContext:]UIGraphicsGetImageFromCurrentImageContext을 사용하여 촬영 한 UIView의 스크린 샷입니다. 현재, 나는 주 스레드에서 완전히 실행 중입니다.메인이 아닌 스레드에서 UIKit, Core Graphics, Core Animation, OpenGL 중 어느 부분이 허용됩니까?

특히 후자의 경우는 UIView 및 그 스크린 샷을 만드는 데 걸리는 시간 동안 OpenGL 렌더링을 중단하기 때문에 꽤 나쁩니다.

이제 OpenGL 코드를이 차단을 피하기 위해 별도의 스레드로 옮길 생각입니다. 이상적으로, 스크린 샷은 OpenGL 렌더링보다 다른 스레드 (필요한 경우 주 스레드)에서 가져온 것입니다.

메인 스레드에서 실행해야하는 항목과 그렇지 않은 항목에 대한 설명서에서 전체 내용을 찾을 수 없었습니다. iOS 4 release notes의 일부 주석과 특정 UIKit 메서드의 일부 주석을 발견했지만 전체 그림이 누락되었습니다.

코드는 iOS 4.x 이상에서 실행됩니다.

답변

3

Don을하지 않는 한 백그라운드 스레드에서 OpenGL ES로 그리기를 할 수 있습니다 동시에 다른 스레드에서 OpenGL 컨텍스트에 액세스하려고 시도하지 마십시오. 이것에 대해서는 Apple의 Technical Q&A QA1612을 참조하십시오.

백그라운드 스레드에서 CALayer 콘텐츠를 업데이트 할 때 많은 문제가 발생했습니다. 따라서 주 스레드에서 레이어 작업을 수행합니다. Core Animation은 어쨌든 배경 스레드에서 애니메이션을 실행합니다.

나는 백그라운드 스레드에서 UIKit와 관련된 내용을 업데이트 한 적이 없지만 UIKit에서 드로잉의 일부는 4.0에서 threadsafe로 만들어졌습니다. David Duncan은 here에서 컨텍스트에 대한 드로잉이 이제 스레드 안전이라고 설명합니다.

귀하의 경우, 백그라운드 스레드에서 OpenGL ES 렌더링을 실행하는 데 문제가 발생하지 않을 것입니다 (GCD의 직렬 디스패치 대기열을 사용하여 여러 스레드의 컨텍스트에 대한 액세스를 한 번에 방지 할 수 있습니다). 다른 이미지 잡기.

2

코어 애니메이션은 일반적으로 스레드로부터 안전하지만 UIKit 및 OpenGL ES (iOS에서는 적어도)는 스레드로부터 안전하지 않습니다. UIKit은 주 스레드에서만 사용해야하며 OpenGL ES는 단일 스레드 (일반적으로 주 스레드)에서 일관되게 사용해야합니다.

+0

OpenGL을 백그라운드 스레드로 이동하고 나머지는 메인 스레드에서 유지하는 것이 효과적일까요? 일부 텍스처를 생성하는 Core Graphics 코드는 어떻게됩니까? OpenGL 쓰레드로 옮길 수 있습니까? –

+0

Pure Core Graphics/Quartz는 작업자 스레드에서 사용할 수 있지만 스레드 경계를 항상 안전하게 통과 할 수있는 것은 아닙니다. UIKit (예 :'UIGraphics ...'함수)를 사용하는 모든 것은 여전히 ​​메인 스레드에서 실행되어야합니다. –

+0

OpenGL은 스레드가 안전합니다. 공유 그룹에 있지 않으면 여러 스레드에서 동일한 컨텍스트를 사용하거나 다른 컨텍스트간에 리소스를 공유 할 수 없습니다. EAGLSharegroup (http://developer.apple.com/library/ios/documentation/OpenGLES/Reference/EAGLSharegroup_ClassRef/)에 대한 설명서를 확인하십시오. – Tommy

관련 문제