2010-10-14 14 views
11

So che condividere un singolo contesto tra i thread è una cattiva notizia. So che posso creare e utilizzare in modo sicuro un contesto con un framebuffer offscreen su un thread secondario quando nulla sta accadendo con GL sul thread principale.OpenGL è thread-safe per più thread con contesti distinti?

Non sono ancora riuscito a trovare una risposta definitiva alla domanda se posso creare due contesti in modo sicuro su due thread diversi (ad esempio, un disegno del thread principale sullo schermo e un thread secondario che esegue il lavoro di disegno fuori campo) e fare in modo che entrambi facciano contemporaneamente chiamate alla funzione GL.

In altre parole, fino a quando i contesti sono diversi, i due thread possono "condividere" l'API C e quindi la GPU? O è intrinsecamente qualcosa che è irremovibile? Oppure questa implementazione è specifica?

Chiedere specificatamente per OpenGL ES su iOS, ma probabilmente è una domanda GL generale.

+0

Correlato: [Devo utilizzare più thread nel mio gioco OpenGL ES?] (Http://stackoverflow.com/questions/5246189/should-i-use-multiple-threads-within-my-opengl-es-game) – bobobobo

risposta

9

Sì, è necessario utilizzare un contesto per ogni thread che si desidera utilizzare con OpenGL, inoltre è possibile condividere oggetti tra i contesti. Questa è la strada da percorrere :)

+5

Non proprio corretto: non è necessario un contesto per thread, è possibile utilizzare lo stesso contesto in più thread, purché non lo si faccia mai nello stesso momento, ad es. bloccando tutti gli accessi al contesto, e fintanto che questo blocco include una barriera di memoria sui sistemi che ne hanno bisogno (il che di solito è sempre il caso per i lucchetti). – Mecki

+0

@Mecki Puoi fornire un riferimento a questa nozione? L'uso di un contesto gl __any__ invocazione di una funzione gl? Ad esempio, posso creare un nuovo oggetto Texture/chiamare 'glTexImage2D' su un contesto gl mentre disegno contemporaneamente dallo stesso contesto gl su un altro thread? – bobobobo

+0

@bobobobo Sì, qualsiasi invocazione di funzione gl * utilizza il contesto correntemente impostato per il thread; altrimenti bisognerebbe alimentare il contesto desiderato per ogni funzione gl. In passato OpenGL supportava solo un contesto per processo, di conseguenza i contesti venivano fatti specifici del thread e sono impostati implicitamente per un thread oggi. E no, non è possibile utilizzare lo stesso contesto su due thread contemporaneamente. Un contesto può essere utilizzato solo da un thread in qualsiasi momento. Puoi solo cambiare il thread a cui è associato un contesto. – Mecki

1

Opzione 1: Se non si utilizza il contesto da due thread contemporaneamente, è sufficiente un contesto.

Opzione 2: Se è necessario utilizzare OpenGL con più thread contemporaneamente, è necessario più di un contesto. Quindi, se i contesti condividono il proprio gruppo di , condividono i loro contenuti OpenGL come trame. In questo modo è possibile caricare trame o elaborare pesanti framebuffer su un thread in background.

Dai un'occhiata alla nell'ultima sezione su Sharegroups qui: http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithOpenGLESContexts/WorkingwithOpenGLESContexts.html

Opzione 3: GLKit fornisce alcune elaborazione in background built-in, ad esempio tessitura asincrono carico tramite GLKTextureLoader s - textureWithContentsOfFile. Non conosco tutte le opzioni, ma sicuramente semplifica alcuni casi di utilizzo di OpenGL asincrona.

Problemi correlati