Forum de la communauté SFML

Aide => Système => Discussion démarrée par: AnselmeSfml le Octobre 18, 2014, 02:32:17 pm

Titre: Brusque lags avec thread & gérance de temps
Posté par: AnselmeSfml le Octobre 18, 2014, 02:32:17 pm
Bonjour!

Dans mon programme, j'utilise un thread qui gère une fonction qui s'occupe d'exécuter une instruction toutes les x millisecondes, et ce jusqu'à ce que l'utilisateur stop le thread. Seulement, j'observe graphiquement de brusques latences, qui apparaissent puis disparaissent de manière totalement aléatoire... J'ai tout d'abord pensé à réduire la fréquence taux d'appel de l'instruction en fonction, mais même toute les 10 secondes, il y a le même taux de latence qu'avec 10 millisecondes. Voilà mon code:

void Map::anime()
{
 m_clock.restart();
        do
        {
            if(m_clock.getElapsedTime() > sf::milliseconds(m_animationSpeed))
            {
                m_clock.restart();
                if(m_animationX<m_maxAnimationX-1) m_animationX += 1;
                    else m_animationX = 0;

                for(int z=0; z<m_height; z++)
                    for(int y=0; y<m_width; y++)
                        for(int x=0; x<m_width; x++)
                {
                    if(m_animationList[getIndexAtCase(x, y, z)]>1 && m_animationX<m_maxAnimationX) setCase(x, y, z, getIndexAtCase(x, y, z));
                }
            }
        } while(!m_stop);
}
 

Ce code s'occupe en fait d'animer des tuiles de la carte en changeant les texcords en question de mes sf::VertexArray.
Merci d'avance!
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: Laurent le Octobre 18, 2014, 06:12:54 pm
Pas besoin d'un thread pour faire ça. Tu rends ton code plus compliqué pour rien. Avec un peu de chance ça résoudra aussi ton problème.
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: AnselmeSfml le Octobre 18, 2014, 08:23:10 pm
Ah? Mais du coup ça ne marchera plus, le programme ne fera que ça, non?
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: Laurent le Octobre 18, 2014, 09:02:52 pm
Non, pas si tu le fais correctement ;)
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: AnselmeSfml le Octobre 18, 2014, 09:10:57 pm
Euh... C'est à dire, correctement? Ma fonction tourne en boucle, comment puis-je exécuter en même temps tout le reste?
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: Laurent le Octobre 18, 2014, 10:26:33 pm
De la même manière que tout le reste, justement. Tu gères bien les évènements, la logique, l'affichage et je ne sais quoi d'autre dans ta boucle principale, non ? Alors pourquoi pas ça aussi ?
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: AnselmeSfml le Octobre 18, 2014, 10:47:01 pm
Parce que je travaille sur un moteur de jeu, et ce doit être géré automatiquement dans la classe "Map".
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: Laurent le Octobre 18, 2014, 10:51:18 pm
Et alors ?
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: AnselmeSfml le Octobre 18, 2014, 11:06:48 pm
Et alors, ceci ne peut être géré dans la boucle d'affichage, puisque le principe c'est que l'animation se gère automatiquement à l'intérieur de la classe en question, sans besoin des appels de fonction de la part de l'utilisateur ...   :-X
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: AnselmeSfml le Octobre 18, 2014, 11:50:01 pm
Dois je revenir au thread?
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: Laurent le Octobre 19, 2014, 10:31:58 am
C'est une mauvaise façon de voir les choses. Fais donc comme tout le monde, une fonction Map::update() que tu appelles à chaque tour de ta boucle principale. Et évite les threads.
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: AnselmeSfml le Octobre 19, 2014, 05:02:28 pm
Mais le problème, c'est que comme je travaille sur la création d'un moteur, l'utilisateur n'a seulement qu'à créer la carte, puis l'afficher avec app.draw(carte). C'est lui qui doit gérer sa boucle de mise à jour, car la carte n'est pas le seul truc qu'il a le droit d'afficher. C'est quelque chose qu'il a libre recours d'utiliser...
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: Laurent le Octobre 19, 2014, 05:16:55 pm
A toi de voir comment tu conçois ton moteur, mais techniquement c'est absurde d'utiliser un thread pour ça, c'est tout ;)
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: AnselmeSfml le Octobre 19, 2014, 05:41:35 pm
D'accord, mais dans mon cas je suis obligé de faire appel aux threads. Mon moteur n'est pas mono-classe.
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: Laurent le Octobre 19, 2014, 06:11:20 pm
Mais tu te rends compte que ton thread, tel qu'il est écrit, pompe 100% de CPU pour ne rien faire ?
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: AnselmeSfml le Octobre 19, 2014, 08:36:04 pm
Oui, j'en suis conscient, mais je ne vois autrement aucune manière de faire qui respecte ce cahier des charges:
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: Laurent le Octobre 19, 2014, 10:44:04 pm
Si tu veux absolument faire comme ça alors je ne vais pas me battre, de toute façon tu te rendras compte toi-même très rapidement des inconvénients de cette façon de faire.

Mais si tu utilises des threads, alors fais-le bien. En l'occurence, assure-toi de bien protéger toutes les variables partagées pour éviter les accès concurrents. Et fais moi plaisir, insère un peu d'attente passive (sf::sleep) dans cette boucle infinie qui monopolise le CPU pour rien :P
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: AnselmeSfml le Octobre 20, 2014, 12:15:07 pm
Mais quels sont justement ces inconvénients? C'est le seul thread que j'utiliserai dans tout le moteur, c'est pas comme ci j'avais 1 thread par animation! Je placerai des sleep.

Merci encore
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: Laurent le Octobre 20, 2014, 12:22:27 pm
Tu auras les mêmes inconvénients que tout code qui utilise plus d'un thread :
- la gestion des threads ça ajoute du boulot au CPU (si tu en as un supplémentaire pour toute ton appli ça reste toutefois complètement négligeable)
- à chaque fois que tu accèdes à une variable partagée entre plusieurs threads il faut protéger cet accès pour éviter les accès concurrents
- conséquence du point précédent : ton code gagne rapidement en complexité, juste pour la gestion du threading, et ta logique se trouve plus ou moins noyée dans tout ça

En général on utilise les threads lorsqu'on veut que deux choses se déroulent en parallèle. Or toi, ce que tu veux paralléliser à ton thread principal, c'est... rien, juste de l'attente. C'est pour ça que ça n'a vraiment pas de sens. De plus, les threads sont généralement une réponse à un problème technique (plusieurs calculs qui ne doivent pas se bloquer les uns les autres), or toi tu les utilises pour économiser à l'utilisateur un appel de fonction ; c'est plus que douteux et personnellement je ne ferai jamais ça ;)
Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: AnselmeSfml le Octobre 20, 2014, 07:41:49 pm
Après avoir calmement relu ce post, je viens de régler mon problème sans utiliser de thread et d'une simplicité déconcertante ;D

En effet, je me suis rendu compte que la boucle infinie utilisée dans le thread était la même réalisée dans la boucle principale d'affichage... J'ai donc utilisé celle-ci pour appeler la méthode "anime()" originellement appelée dans la boucle du thread. L'utilisateur n'a plus qu'à faire appel à carte.anime() lors de la boucle principale et le tour est joué !  :P

Je vois déjà ta tête: il me réexplique tout ce que je lui est dis de faire depuis le début...  :'(

En bref, merci, tu as résolu mon problème. :)


Titre: Re : Brusque lags avec thread & gérance de temps
Posté par: Laurent le Octobre 20, 2014, 08:27:17 pm
Citer
Je vois déjà ta tête: il me réexplique tout ce que je lui est dis de faire depuis le début...
;D

Ce qui compte c'est que tu aies fini par comprendre tout ça. Et comme tu l'as plus ou moins retrouvé par toi-même, ce sera même mieux que si tu avais appliqué bêtement mes conseils ;)