Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Multithreading et OpenGL  (Lu 6163 fois)

0 Membres et 1 Invité sur ce sujet

exkise

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Multithreading et OpenGL
« le: Avril 03, 2012, 11:38:34 pm »
Bonjour,

Je viens sur ce forum pour une raison qui ne concerne pas réellement l'utilisation de la sfml.

En réalité, je tente de faire mon petit moteur de jeu perso ( en partant de zero ou presque ) et je bute actuellement sur le problème du multithreading avec OpenGL. Hors, aillant utilisé la sfml par un temps, j'avais pour habitude de diviser mon rendu dans un thread et le calcul dans un autre ( avec entre autre la création des textures ). Hors de base ce n'est pas possible avec OpenGL et il y a une manipulation à faire avec les contexts.
Ce que j'ai vu c'est donc que la sfml gérait ce problème de façon transparente pour l'utilisateur et j'aurais aimé savoir par quel biais cela est fait ( quelles classes servent à cela ) car j'aimerai implanté un système transparent relativement équivalent.

Pour information complémentaire, je crée ma fenêtre moi-même à l'aide de l'API windows et je crée donc moi même le rendering context ( qui doit être partagé si j'ai bien compris ).

Merci par avance des informations que vous accepterez de me donner  ;)

exkise


Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: Multithreading et OpenGL
« Réponse #1 le: Avril 04, 2012, 08:16:21 am »
C'est quoi "le problème du multithreading avec OpenGL" sur lequel tu butes, précisément ? SFML ne fait pas grand chose à vrai dire, uniquement partager tous ses contextes OpenGL.
Laurent Gomila - SFML developer

Ceylo

  • Hero Member
  • *****
  • Messages: 2325
    • Voir le profil
    • http://sfemovie.yalir.org/
    • E-mail
Re: Multithreading et OpenGL
« Réponse #2 le: Avril 04, 2012, 08:47:08 am »
C'est quoi "le problème du multithreading avec OpenGL" sur lequel tu butes, précisément ? SFML ne fait pas grand chose à vrai dire, uniquement partager tous ses contextes OpenGL.
Et créer un contexte OpenGL sur chaque thread lorsque nécessaire ?
Want to play movies in your SFML application? Check out sfeMovie!

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: Multithreading et OpenGL
« Réponse #3 le: Avril 04, 2012, 09:44:35 am »
Citer
Et créer un contexte OpenGL sur chaque thread lorsque nécessaire ?
Oui, enfin ça j'imagine qu'il le sait, qu'il lui faut un contexte OpenGL avant d'appeler des fonctions OpenGL :)
Laurent Gomila - SFML developer

exkise

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re: Multithreading et OpenGL
« Réponse #4 le: Avril 04, 2012, 04:49:45 pm »
Bonjour, tout d'abord merci de votre réponse,

en réalité, c'est un mécanisme assez mal expliqué sur internet et sur beaucoup de site il semblerait que deux threads ne puissent pas agir sur OpenGL en même temps.

Mon but est effectivement de partager le context OpenGL entre tous les threads, seulement je ne comprends pas bien comment ça doit se faire  :-[

Merci de votre aide

Ceylo

  • Hero Member
  • *****
  • Messages: 2325
    • Voir le profil
    • http://sfemovie.yalir.org/
    • E-mail
Re: Multithreading et OpenGL
« Réponse #5 le: Avril 04, 2012, 06:00:51 pm »
Tu dois voir ça avec la fonction permettant de créer le contexte OpenGL, il y a un paramètre qui est le contexte avec lequel tu veux partager le contexte que tu créés.

Voir http://www.opengl.org/sdk/docs/man/xhtml/glXCreateContext.xml par exemple.
Want to play movies in your SFML application? Check out sfeMovie!

Lynix

  • Sr. Member
  • ****
  • Messages: 403
    • Voir le profil
Re: Multithreading et OpenGL
« Réponse #6 le: Avril 04, 2012, 09:07:14 pm »
en réalité, c'est un mécanisme assez mal expliqué sur internet et sur beaucoup de site il semblerait que deux threads ne puissent pas agir sur OpenGL en même temps.

Bien sur que si, tu peux faire tourner deux application OpenGL en même temps sans souci, le problème ici c'est le contexte, une même application peut faire tourner deux threads qui agiront chacun sur un contexte OpenGL différent (Partagés ou non), cependant le rendu vers une surface S est une opération qu'un seul thread peut effectuer (En tout cas de façon basique, il doit exister des solutions maintenant)

D'ailleurs ça n'aurait pas de réel intérêt d'agir sur un même contexte via deux threads en même temps car la majorité des fonctions de rendu ne font qu'ajouter une opération à la file d'attente de la carte graphique, file d'attente qui est traitée avec un appel à glFlush ou glFinish.

Avec la SFML (Et probablement toutes les applications OpenGL utilisant le double-buffering), le "flush" (traitement de la file d'attente) est fait juste avant l'échange de buffers (Sous windows : SwapBuffers), lors de l'appel à sf::Window::display, c'est ce qui prend le plus longtemps.

Une astuce employée par Qt, consiste à posséder un thread dit "de rendu", dont le seul but est d'effectuer l'échange de buffers (Et donc le flush), en activant d'abord le contexte approprié. Ça permet d'effectuer le rendu par la carte graphique tout en faisant faire des calculs au processeur (Physique, évènements, ...).
Ça n'a cependant d'intérêt qu'à partir du moment que les calculs du processeurs prennent plus de temps que l'activation du contexte (Donc inutile lorsqu'on ne gère que des évènements avec des calculs pas trop complexes, mais pratique dès qu'on est confronté à la physique).

Voila mon pavé ;)
« Modifié: Avril 04, 2012, 09:10:28 pm par Lynix »

exkise

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re: Multithreading et OpenGL
« Réponse #7 le: Avril 04, 2012, 09:36:22 pm »
Merci beaucoup, je crois que je commence à saisir.

En fait, en continuant à farfouillé dans le code de la SFML, j'ai compris ce qu'il me manquait, a savoir la fonction EnsureGlContext() qui m'avait jusqu'alors échapé. Il va maintenant falloir que je réussisse à reproduire le mécanisme "par-thread" pour l'adapter à mon moteur ( sachant que j'ai déjà ma propre classe de gestion de thread ).

Je vous remercie de votre aide.