2011-10-04 3 views
0

을 사용하는 일부 문제가 EAGLViews에 발생합니다. 두 개의 View Controller가 있고 각각 하나는 EAGLView입니다.서로 다른 ViewControllers/EAGLViews에서 동일한 EAGLContext 사용

각보기 컨트롤러는 EAGLContext을 새로 할당하고 EAGLView 각각에 대해 후속 프레임 버퍼/색 버퍼를 만들지 만 메모리 리소스가 낭비됩니다.

Using Multiple OpenGL Views And UIKit

하지만 난 지금까지 그것을 달성하기 위해 관리 didnt가 :

나는 단순히 다른 EAGLViews에 서로 다른 프레임 버퍼/colorbuffers을 결합함으로써 ViewControllers에서 동일한 EAGLContext를 사용하는 것이 가능하다는 것을 알고있다.

아이디어가 있으십니까?

미리 감사드립니다.

답변

0

EAGLView은 실제로 단일 클래스가 아닙니다. 그것은 애플이 그들의 예제 파일에 던져 넣는 경향이있는 동일한 이름을 가진 클래스의 계열이다. 따라서 특정 수정에 대해 조언하는 것은 상대적으로 어렵습니다.

내 초기 솔루션은 단일, 공유 EAGLContext을 제공하는 싱글 톤 클래스를 만드는 것이 었습니다. EAGLContext s는 한 번에 하나의 스레드에서만 사용할 수 있으므로 반드시 완전한 해결책은 아니지만 정확히 원하는 것은 프로그램의 의미에 따라 다르며 실제 질문과 다른 주제로 느껴질 것입니다.

Xcode 4.1 'OpenGL ES 응용 프로그램'템플릿에는보기 외부에서 컨텍스트가 생성되는 반면, 이전에는 내부에있는 것으로 생각되어 다소 쉽습니다.

+0

, 내가 EAGLContext 위임을 통해 두 viewcontrollers 사이에 공유 (하지만 너무 싱글 톤 클래스가 될 수있는) 구현했습니다, 나는 두 번째 뷰 컨트롤러를 전시하는 presentviewcontroller을 수행 할 때 모든 것이 잘 작동하지만 때 내가 첫 번째로 돌아와서 - dismiss를 통해 - 여기에있는 모든 OpenGL 명령어는 BAD_ACCESS 예외를 발생시킵니다. ( –

+0

공유 EAGLContext가 동시에 여러 액세스를 얻지 못하도록하기 위해 세마포를 구현했지만 문제를 해결하지 못했습니다. 흥미롭게도 시뮬레이터에서는 모든 것이 잘 작동합니다. 이상하지 않습니까? –

+0

실제로 스레드를 호핑하고 있습니까? 그렇지 않으면 세마포어가 필요하지 않습니다. 모든 것이 정상 실행 루프의 주 스레드에 있습니다. 컨텍스트가 살아남는다는 것을 확인하거나 부인하기 위해 좀비를 돌릴 가치가 있습니다. 또는'retain','release','dealloc' 및'autorelease'의 구현을 사용하여 EAGLView를 서브 클래스 화하고'super'를 호출 한 다음, 중단 점으로 사용하여 임의의 학대를 트랩합니다. – Tommy

1

마지막으로 문제를 해결할 수있었습니다.

뷰 컨트롤러 중 하나 나 사용 하였다

@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); 

봐라 !

감사합니다 :)