Rendu multithread sur OpenGL
J'ai une application multithread, dans lequel j'essaie de rendre avec les différents threads. J'ai d'abord essayé d'utiliser le même Contexte de Rendu entre tous les threads, mais j'étais NULLE actuel contextes, à d'autres threads. J'ai lu sur internet que l'un contexte ne peut être courant à un seul thread à la fois.
J'ai donc décidé de faire quelque chose de différent. J'ai créer une fenêtre, j'ai le HDC et créer le premier RC. Après cela, je partage ce HDC entre les threads, et dans chaque nouveau thread, j'ai créer je obtenir un nouveau RC à partir de la même HDC et je le fais en courant pour ce thread. Chaque fois que je le fais, le RC retournée est toujours différent (généralement la valeur + 1). Je fais une affirmation à vérifier si wglGetCurrentContext()
retourne un RC, et il semble qu'il renvoie celui qui vient d'être créé. Mais après avoir fait le rendu, je n'ai pas rendu, et si j'appelle GetLastError()
- je obtenir de l'erreur 6 (handle non valide??)
Donc, est-ce à dire que, en dépit de chaque nouvel appel de wglCreateContext()
me donne une nouvelle valeur, en quelque sorte, cela signifie que l'ensemble de ces différentes valeurs sont les mêmes "canal de Connexion" pour les appels OpenGL?
Est-ce à dire que je vais toujours avoir à l'invalidité de la précédente Contexte de Rendu sur un fil de discussion, et de l'activer sur la nouvelle? J'ai vraiment besoin de faire cette synchronisation tout le temps ou est-il un autre moyen de travailler autour de ce problème?
source d'informationauteur filipehd
Vous devez vous connecter pour publier un commentaire.
NE PAS!!!
Vous gagnerez rien d'essayer de le multithread votre convertisseur. Fondamentalement, vous êtes en cours d'exécution dans une grande condition de course et le pilote sera juste occupé de synchroniser les threads pour faire en quelque sorte un sens.
Tirer le meilleur des performances de rendu garder tous OpenGL opérations à un seul thread. Tous les parallélisation arrive gratuitement sur le GPU.
Je vous suggère de lire la suite de l'article wiki de l'OpenGL Consortium.
http://www.opengl.org/wiki/OpenGL_and_multithreading
En termes simples, cela dépend beaucoup de ce que tu veux dire pour le multi threading en ce qui concerne OpenGl, si vous en avez un thread qui effectue le rendu de la partie et un (ou plus) de faire d'autres travaux (c'est à dire de l'IA, la Physique, la logique de jeu etc...) il est parfaitement droit.
Si vous souhaitez avoir plusieurs threads gâcher avec OpenGL, vous ne pouvez pas, ou mieux, que vous pourriez, mais il va vraiment vous donner plus d'ennuis que d'avantages.
Essayer de lire la FAQ sur le parallèle de l'utilisation d'OpenGL pour avoir une meilleure idée sur ce concept:
http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html
Dans certains cas, il peut être judicieux d'utiliser plusieurs de rendu des contextes différents threads. J'ai utilisé une telle conception de charger les données d'image de système de fichiers et les pousser ces données dans une texture.
OpenGL sur Mac OS X est mono-thread-safe; pour l'activer:
Voir:
La simultanéité et OpenGL - Développeur Apple
Et:
Technique Q&UN QA1612: OpenGL ES le multithreading et ...