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
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à ?
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)
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.