2010-12-29 15 views
6

Nella mia app basata su OpenGL-ES 1.1, sto usando CALayer s come sorgente per trame OpenGL. Quelle CALayer s comprendono CGImage s e il testo visualizzato tramite CoreGraphics. Un'altra fonte di texture OpenGL è uno screenshot di uno UIView scattata con -[CALAyer renderInContext:] e UIGraphicsGetImageFromCurrentImageContext. Attualmente, sto funzionando completamente sul thread principale.Quali parti di UIKit, Core Graphics, Core Animation, OpenGL sono consentite su non main-thread?

Quest'ultimo caso in particolare è piuttosto negativo perché interrompe il rendering di OpenGL per tutto il tempo necessario per creare lo UIView e il suo screenshot.

Ora sto considerando di spostare il codice OpenGL in un thread separato nella speranza di aggirare questo blocco. Idealmente, lo screenshot verrebbe preso su un thread diverso (thread principale se necessario) rispetto al rendering OpenGL.

Non sono riuscito a trovare una copertura completa nella documentazione su ciò che richiede l'esecuzione sul thread principale e cosa no. Ho trovato alcuni commenti nel iOS 4 release notes e alcuni commenti in specifici metodi UIKit, ma mi manca l'immagine completa.

Il codice viene eseguito su iOS 4.xo versioni successive.

risposta

3

È possibile eseguire il disegno con OpenGL ES su un thread in background, purché si faccia 't provare ad accedere al contesto OpenGL da un altro thread allo stesso tempo. Vedi Apple Technical Q&A QA1612 per un po 'di più su questo.

Ho avuto una serie di problemi con l'aggiornamento del contenuto di CALayer da un thread in background, quindi lavoro con i livelli sul thread principale. Core Animation spara comunque le sue animazioni su un thread in background.

Non avevo mai aggiornato nulla relativo a UIKit da un thread in background, ma alcuni aspetti del disegno in UIKit sono stati resi sicuri in 4.0. David Duncan commenta here che disegnare in un contesto è ora sicuro.

Nel tuo caso, non vedrei un problema con l'esecuzione del rendering di OpenGL ES su un thread in background (magari utilizzando una coda di invio seriale in GCD per impedire l'accesso al contesto da più thread contemporaneamente) e poi facendo il tuo l'immagine afferra un'altra.

2

Core Animation è generalmente thread-safe, ma UIKit e OpenGL ES (su iOS, almeno) non sono thread-safe. UIKit deve essere utilizzato solo sul thread principale e OpenGL ES deve essere utilizzato in modo coerente su un singolo thread (in genere il thread principale.)

+0

Pensi che funzioni per spostare OpenGL in un thread in background e mantenere il resto sul thread principale? Che mi dici del codice Core Graphics che genera alcune trame? Posso spostarlo anche nel thread OpenGL? –

+0

Pure Core Graphics/Quartz può essere utilizzato su un thread di lavoro, ma non può sempre attraversare i limiti del thread in modo sicuro. Tutto ciò che usa UIKit (come le funzioni 'UIGraphics ...') deve ancora essere eseguito sul thread principale. –

+0

OpenGL è thread-safe, non è possibile utilizzare lo stesso contesto su più thread o condividere risorse tra diversi contesti a meno che non siano in un gruppo di condivisione. Controlla la documentazione per EAGLSharegroup (http://developer.apple.com/library/ios/documentation/OpenGLES/Reference/EAGLSharegroup_ClassRef/). – Tommy

Problemi correlati