2010-10-14 16 views
11

Sé que compartir un único contexto entre hilos es una mala noticia. Sé que puedo crear y usar de forma segura un contexto con un framebuffer fuera de pantalla en un hilo secundario cuando no ocurre nada con GL en el hilo principal.¿OpenGL es seguro para múltiples hilos con contextos distintos?

Todavía no he podido encontrar una respuesta definitiva a la pregunta de si puedo crear dos contextos de manera segura en dos hilos diferentes (por ejemplo, un dibujo de hilo principal en la pantalla y un hilo secundario haciendo un dibujo fuera de plano) y hacer que ambos hagan llamadas de función GL simultáneamente.

En otras palabras, ¿siempre y cuando los contextos sean diferentes, pueden dos hilos "compartir" la API C y por lo tanto la GPU? ¿O es eso inherentemente algo que no se puede compartir? ¿O es esta implementación específica?

Preguntando específicamente por OpenGL ES en iOS, pero probablemente sea una pregunta GL general.

+0

Relacionado: [¿Debo usar varios subprocesos en mi juego OpenGL ES?] (Http://stackoverflow.com/questions/5246189/should-i-use-multiple-threads-within-my-opengl-es-game) – bobobobo

Respuesta

9

Sí, necesita utilizar un contexto para cada subproceso con el que quiera usar OpenGL, también puede compartir objetos entre los contextos. Este es el camino a seguir :)

+5

No es del todo correcto: no necesita un contexto por hilo, puede usar el mismo contexto en más de un hilo, siempre que nunca lo haga al mismo tiempo, por ejemplo al bloquear todo acceso al contexto, y siempre que este bloqueo incluya una barrera de memoria en los sistemas que lo necesiten (lo que generalmente ocurre siempre con los bloqueos). – Mecki

+0

@Mecki ¿Puede proporcionar una referencia a esa noción? ¿Es el uso de un gl contexto __any__ invocación de una función gl? Por ejemplo, ¿puedo crear un nuevo objeto/llamada de textura 'glTexImage2D' en un contexto gl mientras dibujo simultáneamente desde el mismo contexto gl en otro hilo? – bobobobo

+0

@bobobobo Sí, cualquier invocación de función gl * usa el contexto actualmente establecido para el hilo; de lo contrario, uno tendría que alimentar el contexto deseado para cada función gl. En el pasado, OpenGL solo admitía un contexto por proceso, como resultado, los contextos se hacían específicos de un hilo y hoy están implícitamente configurados para un hilo. Y no, no puedes usar el mismo contexto en dos hilos al mismo tiempo. Un contexto solo puede ser utilizado por un hilo en cualquier momento. Solo puede cambiar el hilo al que está vinculado un contexto. – Mecki

1

Opción 1: Si no utiliza el contexto por dos hilos simultáneamente, un contexto es suficiente.

Opción 2: Si necesita utilizar OpenGL por varios hilos simultáneamente, necesita más de un contexto. Luego, si los contextos comparten su Sharegroup, comparten su contenido de OpenGL como texturas. De esta forma, puede cargar texturas o realizar un procesamiento de framebuffer pesado en una cadena de fondo.

Tener un vistazo a la última sección sobre Sharegroups aquí: http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithOpenGLESContexts/WorkingwithOpenGLESContexts.html

Opción 3: GLKit proporciona alguna procesamiento en segundo plano incorporado, por ejemplo asíncrono de carga a través de la textura GLKTextureLoader s - textureWithContentsOfFile. No conozco todas las opciones, pero definitivamente simplifica algunos casos de uso de OpenGL asincrónico.

Cuestiones relacionadas