IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Recommandation OpenGL Multithread


Sujet :

OpenGL

  1. #1
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut Recommandation OpenGL Multithread
    Bonjour à tous,

    Je viens afin d'avoir un avis extérieur sur un façon de générer des textures avec OpenGL sachant que le tout est sur 2 threads.
    1 Thread -> main ( Logique, scene, input...)
    2 Thread -> rendu (OpenGL)

    Je ne vais pas vous balancer tout le code je vais juste vous orienter.
    J'ai un classe pour chaque thread. Ici l'importante est la classe de Rendu. Elle dispose donc d'un thread et d'une methode static qui est grosso modo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Void Render::RenderingThread(.....)
    {
        OpenGL->Init()
        While(thread->running)
        {
           PreRender();
           Render();
           PostRender();
        }
        OpenGL->Release();
    }
    Donc la ou je m’interroge et ou je voudrais un avis extérieur c'est sur le fait que le charge des COLLADA ( dae ) dans le main thread. Je récupère donc un nom de texture, ici "marble.tga". Je lit le tga et recupère ces infos etc....
    De la, il me faut faire un glGenTextures()!

    Or, OpenGL étant dans son thread je dois faire appelle a glGenTextures dans le thread après l'init de OpenGL. Donc ça veux dire:
    - Etre sur que OpenGL est initialisé au moment ou l'on load la texture. Ce qui veut dire que l'on ne peux pas charger le TGA puis glGenTextures après car le thread de rendu n'est pas sur d'être encore lancé ( tout dépendras du code client ).

    Donc j'avais pensé avoir dans la classe de rendu OpenGL un vecteur texture à générer. Ce vecteur sera remplit à chaque demande du thread main , et lu à chaque PreRender() de la scène pour faire le glGenTextures et les supprimer de ce vecteur.

    J'aimerais un avis sur ce choix, avez vous des conseils? avez vous déjà été confronté à ça et qu'elles ont été vos solutions?

    Merci

  2. #2
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Je viens rajouter une autre méthode qui m'a l'air pas mal du tout!
    http://veelck.wordpress.com/2008/11/...ing-in-opengl/

    Il s'agirait de créer 2 context avec wglCreateContext et de faire un wglSharedList pour partager les ressources entres 2 contexts.
    Ici la personne le fait entre 2 threads.

    Je pensais donc à avoir :
    1 thread main avec un HGLRC dans le thread main pour glGenTextures
    1 thread render avec un HGLRC dans le thread render pour rendre le geometry

    Un avis également la dessus?

    Merci encore

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Salut,

    le render thread c'est classique, mais pourquoi ne serait-il pas créé quand tu en as besoin ?
    Je n'ai jamais vu une application ne pas créer son thread de rendu dès son initialisation, avant donc tout appel au premier load de texture etc, et encore moins leur affichage donc.
    Le context est lui créé dans l'init également, et fourni au render thread.
    Sachant que chez nous, et je suppose que chez toi aussi, les load sont threadés le main thread démarre des worker de loading et ne fait pas les load lui-même.

    Je ne touche personnelement pas au render thread, mais il est accessible via son pointeur créé dans l'init. Ce n'est pas le thread qui crée son context il me semble.
    Par contre je bidouille autour du loading thread.
    Quand on crée un worker, on possède directement le pointeur de la donnée, qui sera rempli par le thread, mais que l'on peut donc enregistrer dès maintenant. Il "suffit" d'attendre que le loading thread ait fini de traiter tous ses workers pour être assuré que nos objets sont bien loadés. (écran de loading typique)
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 105
    Billets dans le blog
    146
    Par défaut
    Bonjour,

    Valve parle un peu des applications multithread et du partage de contexte dans cette présentation : http://alexandre-laurent.developpez....-source-linux/ (vers la moitié).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Salut,

    Merci pour vos réponses.
    Pour répondre à Bousk:
    le render thread c'est classique, mais pourquoi ne serait-il pas créé quand tu en as besoin ?
    En fait il est crée la création de mon engine donc créer avant le lancement du thread.

    Dans l'ordre voici ce qui ce passe:
    1 Creation de la fenêtre (WGL et Win32) (Thread Main)
    2 Creation du context OpenGL. (Thread Main)
    3 Creation du context Main. (Thread Main)
    4 wglMakeCurrent du context Main. (Thread Main)
    5 wglShareList entre les contexts OpenGL et Main (Thread Main)
    6 Lancement du thread de rendu (Thread Main)
    7 wglMakeCurrent du context OpenGL sur thread rendu. (Thread Rendu)

    Donc je pense que l'init est bon ( du moins jamais eu de bug comme ça).
    Pour le moment mes loads ne sont pas threader. Faisant tout à la main mon propre Collada loader, mon propre lecteur de tga etc... j'en suis à faire en sorte que ça fonctionne, pour le moment tout roule parfaitement et je m'attaque au loading des textures. Ensuite je le mettrais en multithread

    Je voulais donc savoir si le fait de faire ceci. Permet de faire un glGenTextures sur Main et de pouvoir utiliser l'id générer dans le thread de rendu?
    Egalement, si je lance un autre thread disons un worker de loading. Ce worker aura son thread.
    Est-il possible que la display list soit partagée entre plusieurs autres context? comme par exemple, main avec opengl et worker avec opengl?
    N'y a t il pas de limite à un seul partage?


    Excellente lecture LittleWhite! Merci

  6. #6
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Bon et bien merci a vous!

    J'ai réussis à partager le context wgl avec le main thread et le thread et rendu et je peux utiliser glGenTextures dans le main et faire le rendu dans le thread de rendu sans aucun souci!

    Ceci et ceci Marche parfaitement bien!
    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [LWJGL] Multithreading en OpenGL
    Par infernalbuild dans le forum Langage
    Réponses: 1
    Dernier message: 04/04/2014, 22h45
  2. Qt 5 et OpenGL multithread
    Par Jbx 2.0b dans le forum Multithreading
    Réponses: 0
    Dernier message: 03/03/2014, 16h48
  3. Le multithread SDL/OpenGL est il possible ?
    Par aliwatte dans le forum SDL
    Réponses: 1
    Dernier message: 05/03/2013, 08h18
  4. OpenGL multiThread et Cocoa Touch
    Par alys56 dans le forum OpenGL
    Réponses: 0
    Dernier message: 12/05/2009, 10h16
  5. OpenGL ou DirectX
    Par Nadir dans le forum DirectX
    Réponses: 6
    Dernier message: 02/05/2002, 12h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo