2009-07-15 7 views
9

Dans une tentative de créer une barre de chargement pour un jeu iPhone que je développe (en utilisant Cocos2D), j'ai voulu utiliser une approche multithread.Programmation OpenGL multi-thread dans Cocos2D-iPhone

Un thread affiche un écran de chargement et exécute la boucle d'événement d'application principale tandis qu'un nouveau thread charge silencieusement tous les sprites en arrière-plan (via spriteWithFile), puis les ajoute à un calque.

je crée le nouveau fil en utilisant la méthode detachNewThreadSelector de NSThread (qui envoie des mises à jour de l'état de chargement du thread principal via performSelectorOnMainThread). Le problème auquel je suis confronté est que tous les appels OpenGL (tels que ceux trouvés dans la méthode spriteWithFile) dans le nouveau thread meurent avec une erreur de BUS ERROR ou une erreur d'accès mémoire de quelque sorte. Je suppose que c'est parce que les deux threads tentent de faire des appels OpenGL en même temps ou le nouveau thread n'est pas conscient du contexte OpenGL.

Ce qui doit être fait pour permettre à plusieurs threads de faire des appels OpenGL sur l'iPhone en utilisant Cocos2D-iPhone.

Répondre

2

Je veux faire ça aussi. Je commence à this thread. PS: Cette réponse est très ancienne, maintenant je ne suis pas sûr que le chargement de texture asynchrone est aussi utile qu'il l'était une fois que iOS5 a ajouté des téléchargements de texture «gratuits» via CVOpenGLESTextureCaches. Bien sûr, vous pouvez toujours (& devrait) charger vos ressources dans un thread secondaire, mais donner à ce thread un EAGLContext ne semble pas aussi nécessaire maintenant.

+0

http://www.cocos2d-iphone.org/forum/topic/363 cela a également été utile. –

+0

Lien dans la première réponse: 1. Je reçois un avertissement de logiciel malveillant à partir du navigateur. Quand je dis encore à l'ignorer 2. Je reçois 404. –

+0

J'ai corrigé le lien et mis à jour la réponse. –

1

Apple a quelques bonnes directives pour OpenGL multithread here.

-1

Cocos2d best practices recommande de ne pas utiliser NSTimer et je suppose que la même chose s'applique aux threads. Vous devriez probablement utiliser le Timer object de Cocos. Cela laissera la gestion des threads à Cocos et devrait également vous permettre d'accéder au bon contexte graphique. HTH.

3

Pour mémoire, le nouveau thread doit exécuter les deux lignes suivantes pour pouvoir utiliser l'API OpenGL d'un thread concurrent:

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

Ceci est maintenant obsolète par la méthode addImageAsync fourni par la classe TextureMgr à partir de Cocos2D 0.8.x qui effectue le chargement de texture asynchrone pour vous.