Multithread-OpenGL-Programmierung in Cocos2D-iPhone

9

Beim Versuch, eine Ladeleiste für ein iPhone-Spiel zu erstellen, das ich gerade entwickle (mit Cocos2D), wollte ich einen Multithreading-Ansatz verwenden.

Ein Thread zeigt einen Ladebildschirm und führt die Hauptanwendungsereignisschleife aus, während ein neuer Thread alle Sprites im Hintergrund (über spriteWithFile ) automatisch lädt und dann zu einer Ebene hinzufügt.

>

Ich erstelle den neuen Thread mit der detachNewThreadSelector -Methode von NSThread (die Aktualisierungen des Ladestatus per performSelectorOnMainThread an den Haupt-Thread sendet).

Das Problem, mit dem ich konfrontiert bin, ist, dass alle OpenGL-Aufrufe (wie sie in der Methode spriteWithFile enthalten sind) im neuen Thread mit einem BUS-FEHLER oder Speicherzugriffsfehler in irgendeiner Form abstürzen. Ich nehme an, dass das ist, weil beide Threads versuchen, OpenGL-Aufrufe zur gleichen Zeit zu machen, oder der neue Thread den OpenGL-Kontext nicht kennt.

Was zu tun ist, damit mehrere Threads OpenGL-Aufrufe auf dem iPhone mit Cocos2D-iPhone machen können.

    
Asad R. 15.07.2009, 18:32
quelle

4 Antworten

2

Ich möchte das auch tun.

Ich beginne von dieser Thread .

PS: Diese Antwort ist sehr alt, jetzt bin ich mir nicht sicher, ob das asynchrone Laden von Texturen so nützlich ist, wie es einmal war, seit iOS5 "free" Textur-Uploads über CVOpenGLESTextureCaches hinzugefügt hat. Sicher, du kannst deine Assets immer noch in einem sekundären Thread laden (und sollten), aber es scheint jetzt nicht notwendig, diesem Thread ein EAGLContext zu geben.

    
Rhythmic Fistman 15.07.2009, 22:57
quelle
3

Für den Datensatz muss der neue Thread die folgenden zwei Zeilen ausführen, um die OpenGL-API von einem gleichzeitigen Thread verwenden zu können:

%Vor%

Dies wird jetzt durch die addImageAsync -Methode veraltet, die von der TextureMgr-Klasse in Cocos2D 0.8.x und höher zur Verfügung gestellt wird, die für Sie asynchrone Texturen lädt.

    
Asad R. 19.01.2010 13:22
quelle
1

Apple hat einige gute Richtlinien für Multithread-OpenGL hier .

    
Brad Larson 16.07.2009 00:35
quelle
-1

Cocos2d Best Practices empfehlen die Verwendung von NSTimer und ich nehme an, das gilt auch für Threads . Sie sollten wahrscheinlich das Timer-Objekt von Cocos verwenden. Dadurch bleibt die Threadverwaltung bei Cocos und Sie sollten auch auf den richtigen Grafikkontext zugreifen können. HTH.

    
EightyEight 16.07.2009 00:42
quelle