[OpenGL][SFML] Multithreading avec SFML et context Opengl

Le côté programmation du développement d'un jeu vidéo.

Multithreading avec SFML et context Opengl

Messagepar valentin » 19 Nov 2009, 00:17

Bonjour à tous,

Y aurait il un moyen de réactiver un context OpenGL de manière portable avec la SFML (pour par exemple faire un thread consacré au rendu)?

Parceque là j'initialise OpenGL (avec la création de la fenêtre SFML) dans mon thread de rendu mais "malheur" ça ne fait qu'un tour d'affichage, les suivants n'affichent plus rien.

Code: Tout sélectionner
Exemple simplifié:

int main()
{
    sf::Thread renderThread(&RenderThread);
    renderThread.Launch();

    blablabla;
}

void RenderThread(void* context)
{
    sf::RenderWindow App;
    App.Create(sf::VideoMode(800, 600, 32), "Exemple", sf::Style::Close, Settings);

    while(runRender)
    {
        blablaaffichage
        App.Display();   
    }


Voilà, alors j'ai essayé les App.SetActive(bool) mais ça change rien, jpense pas être le seul à avoir eu le problème mais j'n'ai pas trouvé de solution sur le net donc voilà.

Merci aux âmes charitables.
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar valentin » 21 Nov 2009, 18:48

Up ...
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar valentin » 22 Nov 2009, 19:31

Bon alors la solution (obtenu par laurent sur le forum de la SFML) était de rajouter une petite boucle des evenements dans mon thread de rendu:

sf::Event event;
while (App.GetEvent(event))
{
...
}

qui du coup n'est plus trop un thread de rendu ...
Mais pour l'instant je ferai avec.
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar valentin » 22 Nov 2009, 21:44

Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar TobyKaos » 23 Nov 2009, 19:59

Je comprends pas trop l'intérêt d'avoir un thread pour le rendu.
Tu catch les event puis tu update ta scene et enfin tu fais ton rendu.
Donc le rendu attends toujours que l'update soit terminé.
Les thread peuvent être utile pour le réseau si on doit écouter un port, pour faire des calculs physique sur des archi multi core.

Après peut être que tu avais une bonne raison pour ça?
Toby or not Toby.
Développeur Indépendant de Jeux vidéo.
www.chaos-interactive.com
Twitter
Facebook
[SIGPIC][/SIGPIC]
Avatar de l’utilisateur
TobyKaos
Hello World, I'm new !
 
Messages: 332
Inscription: 03 Jan 2007, 13:07

Messagepar valentin » 23 Nov 2009, 20:20

Bah je compte aussi faire un thread pour la phisique de toute façon et faire du réseau.
Bon jte donne un exemple tout bête
si tu considère le déplacement d'un entitée, tu as on va dire deux façons de penser:
_Soit tu as une boucle qui tourne par exemple toutes les 30ms et toutes les 30ms tu changes de place ton perso d'un vecteur qui sera le (déplacement) / (par le nb d'itération pour y arriver).
et dans ce cas là tu as raison ca change rien. Et d'ailleurs si ta 30fps (qui corespondrai a environ 1 image par boucle) ou 100fps (si tu fait dans un autre thread le rendu) t'auras pas une meilleur sensation de fluidité vu que certains rendus seront identiques.
_Soit tu dis que tu prend ton déplacement de A vers B, tu dis qu'il dure par exemple 5s et du coup a chaque rendu tu peux calculer l'interpolation de manière à obtenir la vraie position à l'instant t de l'entité (différente pour chaque rendu).
et là avoir 30fps ou 100fps c'est très visible (sans accélération de l'entitée évidemment)...

Bon c'est un exemple mais ça peux s'appliquer à d'autre chose
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar TobyKaos » 25 Nov 2009, 00:52

Ce qui est important c'est le taux de rafraichissement pour toi. Hors si tu as un thread qui fait l'affichage à 100 fps alors que ton update ne sera effectivement de 30FPS je vois pas l'intérêt.
Si ton frame rate chute à 10 fps même si tu affiches à 100 fps alors ca va sacader.

Pour ton exemple de déplacement dans tout les cas il faut faire l'interpolation. Tu déplaces ton entité selon un vecteur direction et proportionnellement au temps écoulé entre deux frames.

Bon j'ai peut être faux hein, mais je vois pas trop là.
Toby or not Toby.
Développeur Indépendant de Jeux vidéo.
www.chaos-interactive.com
Twitter
Facebook
[SIGPIC][/SIGPIC]
Avatar de l’utilisateur
TobyKaos
Hello World, I'm new !
 
Messages: 332
Inscription: 03 Jan 2007, 13:07

Messagepar valentin » 25 Nov 2009, 09:13

Bon un autre exemple, tu charges une map ou des images, et t'as envie d'avoir un petit bonhomme animé en même temps qui t'indique le chargement...
Bon bah sans thread de rendu tu peux pas trop.
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar TobyKaos » 26 Nov 2009, 11:19

haaa, bin tu fais un thread de chargement huhu.
Toby or not Toby.
Développeur Indépendant de Jeux vidéo.
www.chaos-interactive.com
Twitter
Facebook
[SIGPIC][/SIGPIC]
Avatar de l’utilisateur
TobyKaos
Hello World, I'm new !
 
Messages: 332
Inscription: 03 Jan 2007, 13:07


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Google [Bot] et 8 invités

cron