2010-08-12 7 views
6

Necesito cargar texturas en el hilo de fondo en OpenGL ES. Pero glGenTextures siempre devuelve cero cuando se lo llama en el hilo de fondo.glGenTextures devuelve cero en el hilo de fondo

-(void) someMethodInMainThread { 
    [self performSelectorInBackground:@selector(load) withObject:nil]; 
} 

-(void) load { 
    GLuint textureID = 0; 
    glGenTextures(1, &textureID);   
} 

textureID es cero. Si cambio el código a [self performSelector: @selector (tmp) withObject: nil]; funcionará correctamente y devolverá 1. ¿Cómo debo cargar texturas en el hilo de fondo?

Respuesta

9

Este es un error común, cada contexto OpenGL puede estar activo (actual) en un único subproceso, por lo que cuando crea un nuevo subproceso, no tiene ningún contexto OpenGL y fallan todas las llamadas GL.

Solución: Cree otro contexto de OpenGL, actualícelo en la secuencia de fondo. Para cargar texturas, también desea compartir los nombres de OpenGL (identificadores de texturas, etc.) con el contexto principal.

+0

Tengo que usar EAGLSharegroup? – Division

+0

Parece que no soy un especialista en iPhone, pero al buscar en Google veo que es la herramienta para compartir recursos entre contextos GL. –

-1

Use [EAGLContext setCurrentContext:] en su hilo de fondo antes de hacer llamadas a OpenGL.

Un EAGLContext solo puede ser el contexto actual en un solo subproceso. Todas las llamadas OpenGL requieren un contexto actual, por lo que debe establecerse desde el hilo de fondo antes de llamar a cualquier función de OpenGL.

Tenga en cuenta que EAGLContexts es no thread-safe.

Desde el doc de Apple:

Usted debe evitar cometer el mismo contexto actual en varios subprocesos. OpenGL ES no ofrece seguridad de subprocesos, por lo que si desea utilizar el mismo contexto en varios subprocesos, debe emplear alguna forma de sincronización de subprocesos para evitar el acceso simultáneo al mismo contexto desde múltiples subprocesos.

Cuestiones relacionadas