2009-07-15 18 views
9

Nel tentativo di creare una barra di caricamento per un gioco per iPhone che sto sviluppando (utilizzando Cocos2D), volevo usare un approccio multithread.Programmazione OpenGL multi-threaded in Cocos2D-iPhone

Un thread mostra una schermata di caricamento ed esegue il ciclo di eventi dell'applicazione principale mentre un nuovo thread carica silenziosamente tutti gli sprite in background (tramite spriteWithFile) e quindi li aggiunge a un livello.

ho creare il nuovo thread utilizzando detachNewThreadSelector il metodo di NSThread (che invia gli aggiornamenti sullo stato di carico al thread principale tramite performSelectorOnMainThread).

Il problema che sto affrontando è che ogni chiamata OpenGL (come quella trovata nel metodo spriteWithFile) nel nuovo thread muore con un ERRORE BUS o un errore di accesso alla memoria di qualche tipo. Presumo che ciò avvenga perché entrambi i thread stanno tentando di effettuare chiamate OpenGL allo stesso tempo o il nuovo thread non è a conoscenza del contesto OpenGL.

Cosa si deve fare per consentire a più thread di effettuare chiamate OpenGL su iPhone utilizzando Cocos2D-iPhone.

risposta

2

Voglio farlo anche io.

Sto iniziando da this thread.

PS: questa risposta è molto vecchia, ora non sono sicuro che il caricamento asincrono delle texture sia utile come una volta da quando iOS5 ha aggiunto caricamenti di texture "gratuiti" tramite CVOpenGLESTextureCaches. Certo è ancora possibile (dovrebbe) caricare le risorse in un thread secondario, ma dando quel thread uno EAGLContext non sembra necessario ora.

+0

http://www.cocos2d-iphone.org/forum/topic/363 anche questo è stato utile. –

+0

Link nella prima risposta: 1. Ricevo avvisi di malware dal browser. Quando dico ancora di ignorarlo 2. Ricevo 404. –

+0

Ho risolto il collegamento e aggiornato la risposta. –

1

Apple ha alcune linee guida valide per OpenGL multithreading here.

-1

Cocos2d best practices consiglia di non utilizzare NSTimer e suppongo che lo stesso valga per i thread. Probabilmente dovresti usare lo Timer object di Cocos. Questo lascerà la gestione dei thread a Cocos e dovrebbe anche consentire di accedere al contesto grafico corretto. HTH.

3

Per la cronaca, il nuovo filo deve eseguire le seguenti due righe di poter utilizzare l'API OpenGL da un thread concorrente:

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

Questo è ora reso obsoleto dalla metodo addImageAsync disponibile dalla classe TextureMgr in Cocos2D 0.8.x in poi che esegue il caricamento asincrono della trama per te.