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.
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? –
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. –
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