2010-08-12 11 views
6

Ich muss Texturen im Hintergrund Thread in OpenGL ES laden. Aber glGenTextures gibt immer Null zurück, wenn es im Hintergrundthread aufgerufen wird.glGenTextures liefert Null im Hintergrund Thread

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

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

TexturID ist Null. Wenn ich den Code in [self performSelector: @selector (tmp) withObject: nil] ändere; es wird funktionieren und zurückgeben 1. Wie soll ich Texturen im Hintergrund Thread laden?

Antwort

9

Dies ist ein häufiger Fehler, jeder OpenGL-Kontext kann nur in einem Thread aktiv (aktuell) sein. Wenn Sie also einen neuen Thread erstellen, hat er keinen OpenGL-Kontext und alle GL-Aufrufe schlagen fehl.

Lösung: Erstellen Sie einen anderen OpenGL-Kontext, um es in Ihrem Hintergrund Thread aktuell zu machen. Um Texturen zu laden, möchten Sie auch OpenGL-Namen (Textur-IDs usw.) mit dem Hauptkontext teilen.

+0

Ich muss EAGLSharegroup verwenden? – Division

+0

Sieht so aus, ich bin kein iPhone-Spezialist, aber beim Googlen sehe ich, dass es das Handle ist, um Ressourcen zwischen GL-Kontexten zu teilen. –

-1

Verwenden Sie in Ihrem Hintergrundthread [EAGLContext setCurrentContext:], bevor Sie OpenGL aufrufen.

Ein EAGLContext kann nur der aktuelle Kontext in einem einzelnen Thread sein. Alle OpenGL-Aufrufe erfordern einen aktuellen Kontext, der vor dem Aufruf einer OpenGL-Funktion aus dem Hintergrundthread gesetzt werden muss.

Beachten Sie, dass EAGLContexts nicht thread-safe sind.

aus dem Apple-doc:

sollten Sie vermeiden den gleichen Kontext Strom auf mehrere Threads zu machen. OpenGL ES bietet keine Thread-Sicherheit. Wenn Sie also denselben Kontext für mehrere Threads verwenden möchten, müssen Sie eine Form der Thread-Synchronisierung verwenden, um den gleichzeitigen Zugriff auf denselben Kontext aus mehreren Threads zu verhindern.

Verwandte Themen