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

Auteur Sujet: comment fonctionne les evenements?  (Lu 3063 fois)

0 Membres et 1 Invité sur ce sujet

Varden

  • Newbie
  • *
  • Messages: 46
    • Voir le profil
comment fonctionne les evenements?
« le: Novembre 23, 2013, 04:49:20 pm »
Alors je précise tout de suite, je n'ai pas de probleme, et je ne critique aucun fonctionnements ^^.

J'aimerai juste savoir plus en détails comment fonctionnent les evenements(sf::Events).

prenons cet exemple:
sf::Event evenements;
        while(fenetre.pollEvent(evenements))
        {
            switch (evenements.type)
            {
                case sf::Event::Closed:
                    fenetre.close();
                    break;
                case sf::Event::KeyPressed:
                    if (evenements.key.code == sf::Keyboard::Escape)
                        fenetre.close();
                    else if(evenements.key.code == sf::Keyboard::P)
                        horloge.on_off();
                    break;
                default:
                    break;
            }
        }

je suis encore novice en programmation, et ma premiere idée serai de dire que les evenements sont tester a chaque boucle, mais cela signifie -t-il que le programme vérifie l'état de chaque touches etc? ou bien plutot que des qu'une touche est presser, cela est "enregistrer" quelque part et que la boucle d'evenements n'aura qu'a effectuer les actions rattacher aux evenements actifs, sans avoir a vérifier l'etat de chaque evenements possible?

par exemple dans mon code (ci-dessus), est-ce qu'a chaque boucle, l'etat de la touche echap est vérifier, ou bien cela se passe -t-il autrement?

dans le premier cas, dans un programme plus complexe, ou il y aurai une multitude d'evenements  gerer, cela ne risque pas d'etre plutot lourd?

deuxiemement, est-il possible d'encapsuler la boucle d'evenements dans une classe avec une fnction "update" ou autre, comme si ce n'etait au fond qu'une simple boucle de switch ou bien est-ce plus complexe?

navré si je m'exprime mal, et navré de faire perdre mon temps avec des questions sans doute tres simples, mais sa ne coute rien de demander ^^.


Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : comment fonctionne les evenements?
« Réponse #1 le: Novembre 23, 2013, 05:37:05 pm »
Non, tous les évènements possibles ne sont pas tout le temps vérifiés. C'est l'inverse : lorsqu'un évènement arrive, l'OS le notifie à SFML, qui le stocke en attendant que tu le traites. Et c'est toi ensuite qui va vérifier si ce qui t'intéresse se trouve dans la pile des évènements qui sont survenus.

Tu peux bien sûr mettre ta boucle d'évènements où tu veux et la gérer comme tu veux, du moment que pollEvent est bien appelé régulièrement pour vider la pile d'évènements.
Laurent Gomila - SFML developer

Varden

  • Newbie
  • *
  • Messages: 46
    • Voir le profil
Re : comment fonctionne les evenements?
« Réponse #2 le: Novembre 23, 2013, 05:45:25 pm »
C'est ce qui me paraissait le plus logique, mais je n'en avait aucune certitude.

donc si je comprend bien, les evenements sont stocké dans la fenetre active, et attendent d'etre traité par la boucle d'evenements.
donc si je voulais créer une classe qui s'occupe de cela, elle devrai stocké les evenements que je veut vérifier, et effectuer cette vérification sur la fenetre de mon choix, puis appeler pollEvent pour mettre a zero les evenements.

si j'ai bon, merci a toi pour ta réponse encore une fois tres rapide!

[EDIT](j'espere qu'il sera vu)

Je ne m'y suis pas attaquer du week-end, mais là j'y retourne. après réflexion, j'aurai une derniere question pour vérifier si j'ai bien compris.

en prenant la construction du premier message pour la boucle d'evenements, imaginon que j'ai une dizaine de "case:" à mon switch, et qu'il y a 2 evenements stocker et pret a etre traiter (par exemple une touche presser et un clic de souris). si j'ai bien compris, l'evenements en haut de la liste et stocker dans "evenements", puis comparer avec chaque "case" du switch. puis on le remplace par le suivant dans la liste des evenements a traiter et on supprime l'ancien. jusqu'à ce qu'il n'y ai plus d'evenements a traiter, et la boucle se termine enfin.

si c'est bien comme cela que sa se passe cela signifie que la vitesse d'execution dépendras de la taille de mon switch. si j'ai une multitude d'evenements possible dans mon switch mais qu'il n'y en as que quelques un qui sortent régulierement, ils devront quand meme etre comparer avec plus ou moins la totalité des "case" de mon switch, cela dépendant de l'optimisation de mon compilateur.

voila simple question, que j'espere n'avoir pas trop mal formuler.
« Modifié: Novembre 26, 2013, 04:38:01 pm par Varden »

Lynix

  • Sr. Member
  • ****
  • Messages: 403
    • Voir le profil
Re : comment fonctionne les evenements?
« Réponse #3 le: Décembre 07, 2013, 01:21:57 pm »
Alors il y a deux choses que tu dois savoir, la première c'est que ton ordinateur est extrêmement rapide comparé à la vitesse prise pour une condition, il fait des dizaines de millions de conditions à la seconde, ce n'est pas en en enlevant cinq que tu vas changer quoi que ce soit.

La seconde, c'est que les switch sont généralement implémentés sous la forme de jump table, autrement dit plutôt que de mettre une condition par cas, le compilateur va générer une table contenant les adresses d'exécution pour chaque cas, et sauter directement au bon endroit.
Autrement dit, un switch avec dix cas et un avec un millier de cas vont s'exécuter à la même vitesse.

Honnêtement, ne t'embête pas avec les performances de ton programme, il faudra que tu fasses bien des choses avant de devoir t'en soucier, et d'ailleurs il faut toujours faire un programme qui fonctionne avant de chercher à l'optimiser (Uniquement dans le cas où c'est nécessaire !).