2009-07-15 2 views
9

iPhone 게임을위한 로딩 바를 만들려고 시도하면서 (Cocos2D 사용) 멀티 스레드 방식을 사용하고 싶었습니다.Cocos2D-iPhone의 멀티 스레드 OpenGL 프로그래밍

하나의 스레드는로드 중 화면을 표시하고 기본 응용 프로그램 이벤트 루프를 실행하는 반면 새 스레드는 백그라운드에서 모든 스프라이트를 자동으로로드 (spriteWithFile 통해) 한 다음 레이어에 추가합니다.

나는 ( performSelectorOnMainThread를 통해 메인 스레드로드 상태 업데이트를 전송) NSThread의 detachNewThreadSelector 방법을 사용하여 새 스레드를 만들 수 있습니다.

내가 직면 한 문제는 새 스레드에서 어떤 종류의 BUS ERROR 또는 메모리 액세스 오류가 발생하여 OpenGL 호출이 (spriteWithFile 메서드 내에있는 것과 같은) 호출된다는 것입니다. 두 스레드가 동시에 OpenGL 호출을 시도하거나 새 스레드가 OpenGL 컨텍스트를 인식하지 못하기 때문에 이것이라고 가정합니다.

여러 스레드가 Cocos2D-iPhone을 사용하여 iPhone에서 OpenGL 호출을 할 수있게하려면 어떻게해야합니까?

답변

2

나는 이것을 너무하고 싶다.

저는 this thread부터 시작합니다.

추 신 :이 답변은 매우 오래된 것입니다. iOS5가 CVOpenGLESTextureCaches을 통해 "무료"텍스처 업로드를 추가 한 이후로 비동기 텍스처 로딩이 이전처럼 유용하다고 확신하지 못합니다. 물론 (&해야합니다) 보조 스레드에서 자산을로드 할 수 있지만 EAGLContext 해당 스레드를 제공하는 지금 필요하지 않습니다.

+0

http://www.cocos2d-iphone.org/forum/topic/363이 또한 도움이되었습니다. –

+0

첫 번째 대답의 링크 : 1. 브라우저에서 멀웨어 경고가 나타납니다. 내가 아직도 그것을 무시한다고 말할 때 2. 나는 404를 얻는다. –

+0

나는 링크를 고쳤고 대답을 업데이트했다. –

1

Apple은 멀티 스레드 OpenGL here에 대한 몇 가지 좋은 지침을 가지고 있습니다.

-1

Cocos2d best practices은 NSTimer를 사용하지 않는 것이 좋습니다. 동일한 내용이 스레드에도 적용된다고 가정합니다. 아마도 Cocos의 Timer object을 사용해야합니다. 이것은 스레드 관리를 Cocos로 남겨두고 올바른 그래픽 컨텍스트에 액세스 할 수 있도록해야합니다. HTH. 이는 현재 제공되는 addImageAsync 방법으로 폐기한다

EAGLContext *k_context = [[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1 sharegroup:[[[[Director sharedDirector] openGLView] context] sharegroup]] autorelease]; 
[EAGLContext setCurrentContext:k_context]; 

: 기록을 위해

3

, 새로운 스레드는 동시 스레드에서의 OpenGL API를 사용할 수 있도록 다음 두 줄을 실행해야 Cocos2D 0.8.x 이후의 TextureMgr 클래스는 비동기 텍스처로드를 지원합니다.