2010-12-29 26 views
6

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.

Respuesta

3

Puede dibujar con OpenGL ES en un hilo de fondo, siempre y cuando lo haga Intente acceder al contexto de OpenGL desde otro hilo al mismo tiempo. Ver el Technical Q&A QA1612 de Apple para un poco más sobre esto.

Me he encontrado con una serie de problemas con la actualización del contenido CALayer de un hilo de fondo, por lo que hago cualquier trabajo con capas en el hilo principal. Core Animation dispara sus animaciones en un hilo de fondo, de todos modos.

Nunca había actualizado nada relacionado con UIKit de un hilo de fondo, pero algunos aspectos del dibujo en UIKit se hicieron seguros en 4.0. David Duncan comenta here que dibujar en un contexto ahora es enhebrable.

En su caso, no vería un problema con la ejecución de OpenGL ES en un hilo de fondo (tal vez usando una cola de envío serial en GCD para evitar el acceso al contexto de múltiples hilos a la vez) y luego captura de imagen en otro.

2

La animación principal generalmente es segura para subprocesos, pero UIKit y OpenGL ES (en iOS, al menos) no son seguros para subprocesos. UIKit solo se debe usar en el hilo principal, y OpenGL ES se debe usar consistentemente en un único hilo (normalmente el hilo principal).

+0

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

+0

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

+0

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

Cuestiones relacionadas