9
votes

Programmation opengl multi-threadé dans cocos2d-iphone

Dans une tentative de création d'une barre de chargement pour un jeu iPhone, je développe (en utilisant CocOS2D), je voulais utiliser une approche multithreadée.

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

Je crée le nouveau thread à l'aide de la méthode DETACTHNEWTHTReCelector de Nsthread (qui envoie des mises à jour de l'état de chargement sur le fil principal via SpectacleSelectorAnmaintHread ).

Le problème que je suis confronté est que tous les appels OpenGL (tels que ceux trouvés dans la méthode Spritewithfile ) dans le nouveau fil de fil avec une erreur d'erreur de bus ou d'accès à la mémoire de quelque sorte. Je suppose que cela est que les deux threads tentent de rendre les appels OpenGL en même temps ou que le nouveau thread n'est pas au courant du contexte OpenGL.

Qu'est-ce qui doit être fait pour permettre à plusieurs threads de faire des appels opengl sur l'iPhone à l'aide de Cocos2D-iPhone.


0 commentaires

4 Réponses :


2
votes

Je veux faire ça aussi.

Je commence à partir de Ce fil .

PS: Cette réponse est très ancienne, maintenant je ne suis pas sûr que la chargement de texture asynchrone soit aussi utile que depuis une fois depuis que iOS5 a ajouté des téléchargements de texture "gratuits" via cvopenglestextureces . Bien sûr, vous pouvez toujours (& DO) charger vos actifs dans un thread secondaire, mais donner ce fil un eaglcontext ne semble pas si nécessaire maintenant.


1 commentaires

Lien dans la première réponse: 1. Je reçois un avertissement de logiciels malveillants à partir du navigateur. Quand je dis toujours à l'ignorer 2. J'obtiens 404.



2
votes

Apple a de bonnes lignes directrices pour Multhreaded OpenGL ici .


0 commentaires

-1
votes

cocos2d Meilleures pratiques Recommander contre l'utilisation de Nstimer et je suppose que le la même chose s'applique aussi aux threads. Vous devriez probablement utiliser des cocos ' Objet de la minuterie . Cela laissera la gestion du fil à Cocos et doit également vous permettre d'accéder au contexte graphique correct. Hth.


0 commentaires

3
votes

Pour l'enregistrement, le nouveau thread doit exécuter les deux lignes suivantes pour pouvoir utiliser l'API OpenGL à partir d'un thread concomitable:

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


0 commentaires