2009-07-15 8 views
9

In einem Versuch, eine Ladeleiste für ein iPhone-Spiel zu erstellen, das ich (mit Cocos2D) entwickle, wollte ich einen Multithread-Ansatz verwenden.Multithread-OpenGL-Programmierung in Cocos2D-iPhone

Ein Thread zeigt einen Ladebildschirm an 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.

I erstellen den neuen Thread NSThread die Verwendung detachNewThreadSelector Methode (die über performSelectorOnMainThread Aktualisierungen des Ladestatus an die Haupt-Thread sendet).

Das Problem, mit dem ich konfrontiert bin, ist, dass alle OpenGL Aufrufe (wie die in der spriteWithFile Methode) im neuen Thread sterben mit einem BUS-Fehler oder Speicherzugriffsfehler irgendeiner Art. 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 getan werden muss, damit mehrere Threads OpenGL-Aufrufe auf dem iPhone mit Cocos2D-iPhone machen können.

Antwort

2

Ich möchte das auch tun.

Ich bin von this thread gestartet.

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

+0

http://www.cocos2d-iphone.org/forum/topic/363 das war auch hilfreich. –

+0

Link in erster Antwort: 1. Ich bekomme Malware-Warnung vom Browser. Wenn ich immer noch sage, es zu ignorieren 2. Ich bekomme 404. –

+0

Ich reparierte den Link & aktualisierte die Antwort. –

1

Apple hat einige gute Richtlinien für Multithread OpenGL here.

-1

Cocos2d best practices empfehlen gegen NSTimer und ich nehme an, das gilt auch für Threads. Sie sollten wahrscheinlich Cocos Timer object verwenden. Dadurch bleibt die Threadverwaltung bei Cocos und Sie sollten auch auf den richtigen Grafikkontext zugreifen können. HTH.

3

Für die Aufzeichnung muss der neue Faden die folgenden zwei Zeilen auszuführen zu können, die OpenGL API von einem gleichzeitigen Gewinde verwenden:

EAGLContext *k_context = [[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1 sharegroup:[[[[Director sharedDirector] openGLView] context] sharegroup]] autorelease]; 
[EAGLContext setCurrentContext:k_context]; 

Das nun von der addImageAsync Verfahren überflüssig gemacht wird bereitgestellt von der TextureMgr-Klasse ab Cocos2D 0.8.x, die das asynchrone Laden von Texturen für Sie übernimmt.