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

Auteur Sujet: [SFML 2.0] Threads et frame rate  (Lu 3599 fois)

0 Membres et 1 Invité sur ce sujet

Macrob

  • Jr. Member
  • **
  • Messages: 52
    • Voir le profil
[SFML 2.0] Threads et frame rate
« le: Juillet 24, 2012, 02:59:20 pm »
Salut tout le monde,

Je fais mes premiers essais d'un programme qui a 3 sf::Thread :
1 pour la récupération des events, 1 pour l'affichage et 1 pour les calculs.
Cependant j'ai remarqué que les threads ne tenaient pas compte de frame rate (que j'ai limité à 30).

Voici le code en question :

void Game_engine::init_threads()
{
    m_app.setActive(false);

    processing_thread = new sf::Thread(&Game_engine::update, this);
    rendering_thread = new sf::Thread(&Game_engine::dessiner, this);

    processing_thread->launch();
    rendering_thread->launch();
}

Où Game_engine est la classe qui a la sf::RenderWindow (m_app).

Les fonctions membres update() et dessiner() sont des boucles while :
void Game_engine::update()
{
    // Appelé par le processing thread
    while(m_app.isOpen())
    {
        m_scenes[m_scene_actuelle]->update();
    }
}

Mais la boucle tourne à une vitesse démente en dépit de frame rate que j'ai mis dans le constructeur
de la classe Game_engine : m_app.setFramerateLimit(30);


Voilà, si vous avez une idée, je suis preneur, car je ne vois pas pourquoi les threads dépassent
la limite de frame !  :-\

Merci et bonne journée
« Modifié: Juillet 24, 2012, 03:01:04 pm par Macrob »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0] Threads et frame rate
« Réponse #1 le: Juillet 25, 2012, 11:13:11 pm »
La limite n'est appliquée que dans le thread qui appelle display().
Laurent Gomila - SFML developer

Macrob

  • Jr. Member
  • **
  • Messages: 52
    • Voir le profil
Re : [SFML 2.0] Threads et frame rate
« Réponse #2 le: Juillet 25, 2012, 11:52:37 pm »
hallelujah, Laurent est de retour  :D

Merci, ça répond tout à fait à ma question, bonne soirée  :)

Macrob

  • Jr. Member
  • **
  • Messages: 52
    • Voir le profil
Re : [SFML 2.0] Threads et frame rate
« Réponse #3 le: Août 13, 2012, 03:02:02 am »
Je me permets de upper le sujet.

Dès lors que seul le thread qui appelle le display est limité en frame rate, comment faire pour avoir un thread qui s'occupe uniquement de l'update qui ne tourne pas à une vitesse aberrante ?

Par exemple avec un objet "Game", qui a une méthode update() et une méthode draw(), comment appeler ces deux méthodes avec deux threads en évitant les problème de "Failed to activate the window's context" ?

Merci d'avance, je patauge pas mal avec les threads en ce moment  ???

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0] Threads et frame rate
« Réponse #4 le: Août 13, 2012, 08:15:18 am »
Citer
en évitant les problème de "Failed to activate the window's context" ?
Je ne suis pas devin ;) Quel morceau de code provoque cette erreur ?

J'imagine que tu utilises des fonctions de dessin dans les deux threads, ce qui n'est pas normal. Les fonctions qui se servent du contexte (clear/draw/display) devraient toutes se trouver dans le thread de dessin, le thread d'update devrait pouvoir tourner sans faire appel à la fenêtre.
Laurent Gomila - SFML developer

Macrob

  • Jr. Member
  • **
  • Messages: 52
    • Voir le profil
Re : [SFML 2.0] Threads et frame rate
« Réponse #5 le: Août 13, 2012, 09:01:50 am »
Hé, désolé, j'ai fait deux questions en une.

Il n'y a pas de draw dans mon thread update, en revanche je l'ai placé dans la boucle suivante (dans le main) :


    sf::Thread process(&Game::update, game);
    sf::Thread draw(&Game::dessiner, game);

    while(game->m_app.isOpen())
    {
        process.launch();
        draw.launch();
    }

Voici la méthode "update" de "Game" qui pose problème :

void Game::update()
{
    m_mouse_pos = sf::Mouse::getPosition(m_app);

    sf::Event event;
    while(m_app->pollEvent(event))
    {
            // Gestion des evenements
    }

    // Update du jeu

}

Je sens bien que je suis à coté de la plaque, mais je voulais éviter que le thread qui appelle les update tourne a des centaines de frames par secondes.
Du coup je ne comprends pas bien les histoires de "setActive()", le problème doit venir de là ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0] Threads et frame rate
« Réponse #6 le: Août 13, 2012, 09:13:45 am »
Citer
    while(game->m_app.isOpen())
    {
        process.launch();
        draw.launch();
    }
Quelle horreur :o
Lancer un thread coûte très cher, il faut les lancer une fois au début et faire tourner une boucle dans chaque thread directement !
Une fois que tu auras fait ça, ton problème sera très facilement reglé. Mais je ne te dis pas comment, c'est expliqué dans le tutoriel ;)
(bien sûr, si tu l'as déjà lu et ne comprend pas comment faire, je t'expliquerai)

Citer
je voulais éviter que le thread qui appelle les update tourne a des centaines de frames par secondes.
Dans ce cas il suffit d'un petit sf::sleep à chaque itération pour calmer le jeu. Si tu veux fixer un framerate à peu près constant, il faudra calculer le temps de pause en fonction du temps pris par la dernière itération.
Laurent Gomila - SFML developer

Macrob

  • Jr. Member
  • **
  • Messages: 52
    • Voir le profil
Re : [SFML 2.0] Threads et frame rate
« Réponse #7 le: Août 13, 2012, 09:19:28 am »
Ok, merci beaucoup pour les conseils ! Maintenant j'essaye de me débrouiller.

P.S : maintenant je comprends mieux mes drop de framerate mystérieux...  ;D

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0] Threads et frame rate
« Réponse #8 le: Août 13, 2012, 09:25:44 am »
Un dernier conseil (indiqué également dans le tutoriel) : laisse la boucle d'évènements dans le thread principal, toute autre configuration ne fonctionnera pas sous Mac OS X. Et puis de toute façon là tu n'avais plus rien dans ton thread principal, c'était un peu du gaspillage ;)
Laurent Gomila - SFML developer

Macrob

  • Jr. Member
  • **
  • Messages: 52
    • Voir le profil
Re : [SFML 2.0] Threads et frame rate
« Réponse #9 le: Août 13, 2012, 10:06:47 am »
Un grand merci pour l'aide, ça marche beaucoup (mais vraiment beaucoup) mieux maintenant  :)

Le tuto contient toutes les infos, mais c'est très dense pour un débutant, faut extrapoler !
« Modifié: Août 13, 2012, 10:10:14 am par Macrob »