En mi aplicación basada en OpenGL-ES 1.1, estoy usando CALayer
s como fuente de texturas OpenGL. Esos CALayer
s comprenden CGImage
sy el texto se procesa a través de CoreGraphics. Otra fuente de textura OpenGL es una captura de pantalla de UIView
tomada usando -[CALAyer renderInContext:]
y UIGraphicsGetImageFromCurrentImageContext
. Actualmente, estoy ejecutando completamente en el hilo principal.¿Qué partes de UIKit, Core Graphics, Core Animation, OpenGL están permitidas en no main-thread?
Este último caso en particular es bastante malo porque detiene la representación de OpenGL durante todo el tiempo que lleva crear el UIView
y su captura de pantalla.
Ahora estoy considerando mover el código de OpenGL a un hilo separado con la esperanza de evitar este bloqueo. Idealmente, la captura de pantalla se tomaría en un hilo diferente (hilo principal si es necesario) que el renderizado OpenGL.
No pude encontrar una cobertura completa en la documentación sobre lo que requiere ejecutarse en el hilo principal y lo que no. Encontré algunos comentarios en el iOS 4 release notes, y algunos comentarios en métodos específicos de UIKit pero me falta la imagen completa.
El código se ejecuta en iOS 4.xo superior.
¿Crees que funcionaría mover OpenGL a un hilo de fondo y mantener el resto en el hilo principal? ¿Qué pasa con el código Core Graphics que genera algunas de las texturas? ¿Puedo mover eso al hilo de OpenGL también? –
Pure Core Graphics/Quartz se puede utilizar en un hilo de trabajo, pero no siempre puede cruzar los límites del hilo de forma segura. Todo lo que use UIKit (como las funciones 'UIGraphics ...') aún debe ejecutarse en el hilo principal. –
OpenGL es seguro para el hilo, simplemente no puede usar el mismo contexto en varios hilos o compartir recursos entre contextos diferentes, a menos que estén en un grupo sha. Consulte la documentación de EAGLSharegroup (http://developer.apple.com/library/ios/documentation/OpenGLES/Reference/EAGLSharegroup_ClassRef/). – Tommy