마지막으로 문제를 해결할 수있었습니다.
뷰 컨트롤러 중 하나 나 사용 하였다
@syncronized(context) { ...opengl drawing here...}
: 멀티 스레딩 환경 EAGLContext 사용시
dispatch_async(openGLESContextQueue, ^{
[(EAGLView *)self.view setFramebuffer];
(...opengl draw code...)
[(EAGLView *)self.view presentFramebuffer];
});
하는 하나를 사용하여 동시에 그것을 액세스하는 다른 스레드 않도록주의해야
을 사용하고 현재 dispatch_queue를 비우기 전에 다음과 같이 다른 ViewController (presentViewController :)를 통해 컨트롤을 전달하기 전에 :
dispatch_sync(openGLESContextQueue, ^{});
그래서이 두 가지 트릭을 사용하여 여러보기에서 하나의 EAGLContext를 사용할 수있었습니다. EAGLContext의 현재 상태에 대해서도주의를 기울여야합니다. 나는 때문에 처음 내가 가진보기에서 예기치 않은 결과를 가지고 있었다 :에 나는 완전히 다른 그리기 코드를 가지고 두 번째보기에서
glVertexPointer(2, GL_FLOAT, 0, squareVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
glEnableClientState(GL_COLOR_ARRAY);
, 내가 잊고 물론, 사용 :
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
봐라 !
감사합니다 :)
, 내가 EAGLContext 위임을 통해 두 viewcontrollers 사이에 공유 (하지만 너무 싱글 톤 클래스가 될 수있는) 구현했습니다, 나는 두 번째 뷰 컨트롤러를 전시하는 presentviewcontroller을 수행 할 때 모든 것이 잘 작동하지만 때 내가 첫 번째로 돌아와서 - dismiss를 통해 - 여기에있는 모든 OpenGL 명령어는 BAD_ACCESS 예외를 발생시킵니다. ( –
공유 EAGLContext가 동시에 여러 액세스를 얻지 못하도록하기 위해 세마포를 구현했지만 문제를 해결하지 못했습니다. 흥미롭게도 시뮬레이터에서는 모든 것이 잘 작동합니다. 이상하지 않습니까? –
실제로 스레드를 호핑하고 있습니까? 그렇지 않으면 세마포어가 필요하지 않습니다. 모든 것이 정상 실행 루프의 주 스레드에 있습니다. 컨텍스트가 살아남는다는 것을 확인하거나 부인하기 위해 좀비를 돌릴 가치가 있습니다. 또는'retain','release','dealloc' 및'autorelease'의 구현을 사용하여 EAGLView를 서브 클래스 화하고'super'를 호출 한 다음, 중단 점으로 사용하여 임의의 학대를 트랩합니다. – Tommy