IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

[SDL-jeux]problème gestion de temps


Sujet :

SDL

  1. #21
    Membre du Club Avatar de Jordinateur
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 51
    Points
    51
    Par défaut
    Exactement
    Désolé je l'ai fais vite fais j'ai pas pensé

  2. #22
    Membre éprouvé Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Points : 1 054
    Points
    1 054
    Par défaut
    Et utiliser un SDL_Timer ne serait pas plus pratique ?

    On en regle un pour qu'il appele toutes les secondes une callback qui remet l'affichage à jour. Avantage, entre deux mises à jours de l'affichage, le processeur n'est pas du tout utilisé par la routine de gestion du temps.

  3. #23
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par fenkys Voir le message
    Et utiliser un SDL_Timer ne serait pas plus pratique ?

    On en regle un pour qu'il appele toutes les secondes une callback qui remet l'affichage à jour. Avantage, entre deux mises à jours de l'affichage, le processeur n'est pas du tout utilisé par la routine de gestion du temps.
    Ce n'est pas faux MAIS : juste parce que le code n'est plus écrit par le programmeur n'est pas écrit ne veut pas dire qu'il n'utilise pas des ressources.

    Un timer utilisera des ressources internes, du coup, ce n'est pas aussi évident de dire si ce sera mieux ou non. Ensuite, il est rare de vouloir cadencer le rendu, généralement on cadence les animations et on fait le rendu le plus rapidement possible...

    Jc

  4. #24
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Sinon, pour ton nombre de cartourches qui s'épuise, il y a une solution toute simple dans l'utilisation de SDL_PollEvent (et à mon c'est ça ton problème):

    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while (...)
    {
      SDL_PollEvent(&event);
      [code de gestion de l'event]
     
      ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while (...)
    {
      if (SDL_PollEvent(&event) != 0)
      {
        [code de gestion de l'event]
      }
     
      ...
    }

  5. #25
    Membre éprouvé Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Points : 1 054
    Points
    1 054
    Par défaut
    Je ne parlais pas de cadencer l'affichage (en me relisant si en fait, les mefaits du jus de tomate), mais d'avoir un SDL_timer qui toutes les secondes incrémente un compteur de temps. Un tel système n'aura pas la précision d'un montre à quartz, mais elle sera bien suffisante pour un jeu, avec une faible consommation de ressources. D'ailleurs, ma réponse correspond à la demande de l'auteur de l'item #18.

    Je ne sais pas quel système utilise le concepteur de départ, mais sur mon ordinateur personnel, un SDL_timer en fonctionnement utilise 0% du temps processeur. De même que SDL_WaitEvent, alors que SDL_PollEvent me fait monter à 98% sans qu'aucune action ne soit effectuée. SDL_timer et SDL_WaitEvent utilisent tous deux les propriétés multitaches du système d'exploitation pour ne pas gaspiller de ressources.

  6. #26
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    Citation Envoyé par fenkys Voir le message
    Je ne sais pas quel système utilise le concepteur de départ, mais sur mon ordinateur personnel, un SDL_timer en fonctionnement utilise 0% du temps processeur. De même que SDL_WaitEvent, alors que SDL_PollEvent me fait monter à 98% sans qu'aucune action ne soit effectuée. SDL_timer et SDL_WaitEvent utilisent tous deux les propriétés multitaches du système d'exploitation pour ne pas gaspiller de ressources.
    ce n'est pas SDL_PollEvent qui fait que tu utilises 98% de CPU
    il suffit d'un SDL_Delay pour rendre la main à l'OS de temps à autre, chose que font SDL_Timer et SDL_WaitEvent

    Citation Envoyé par Bibicy Voir le message
    En mettant un delai faible, genre SDL_Delay(25), je pense que tu peux avoir le même résultat, tout en réduisant l'occupation du CPU.
    je plussoie sauf que 25 de delay c'est... beaucoup trop, met le minimum : 1
    juste de quoi rendre la main à l'OS qui reviendra quand il aura traité sa file de messages, ce qui peut prendre beaucoup plus de 1ms, c'est vraiment histoire de rentre la main à l'OS

    par exemple une boucle comme celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    while(running)
    {
    	// traitement des messages
    	SDL_Event event;
    	while (SDL_PollEvent(&event))
    	{
    	...
    	}
     
    	// dessin
     
    	// gestion du temps avec SDL_GetTicks
     
    	// affichage avec SDL_Flip
    }
    va pomper 100% de CPU et le système va ramer
    ajoutes un SDL_Delay(1) dans la boucle, ton taux d'occupation CPU diminuera et le système deviendra plus réactif
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  7. #27
    Membre éprouvé Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Points : 1 054
    Points
    1 054
    Par défaut
    Tu es sûr que SDL_timer utilise un SDL_delay. Sa facon de se comporter ne me semble pas compatible avec cela.

    Un SDL_delay par exemple te prend la main et passe le controle à l'OS alors que le SDL_timer te rend la main et tu peux continuer ton traitement, le SDL_timer faison son décompte de son coté.

  8. #28
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    je me suis mal exprimé, je ne voulais pas dire que SDL_Timer faisait un SDL_Delay mais plutot que SDL_Timer rendait la main au système

    le fonctionnement n'est pas le même comme tu dis, puisque un SDL_Timer défini une fonction qui sera appelé selon un intervalle de temps voulu
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  9. #29
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    je me suis mal exprimé, je ne voulais pas dire que SDL_Timer faisait un SDL_Delay mais plutot que SDL_Timer rendait la main au système

    le fonctionnement n'est pas le même comme tu dis, puisque un SDL_Timer défini une fonction qui sera appelé selon un intervalle de temps voulu
    T'es sûr qu'il rend la main ? Il me semblerait qu'un simple SDL_Timer ne rendrait pas la main puisque c'est dans le coeur de la SDL qu'il y a une vérification Est-ce qu'on doit exécuter un Timer ? Et je ne vois pas pourquoi un SDL_Delay serait fait dans ce cas là.

    Je peux me tromper bien sûr
    Jc

  10. #30
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 77

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par fearyourself Voir le message
    T'es sûr qu'il rend la main ? Il me semblerait qu'un simple SDL_Timer ne rendrait pas la main puisque c'est dans le coeur de la SDL qu'il y a une vérification Est-ce qu'on doit exécuter un Timer ? Et je ne vois pas pourquoi un SDL_Delay serait fait dans ce cas là.

    Je peux me tromper bien sûr
    Jc
    Il me semble que les deux fonctions rendent la main au système, c'est à dire qu'elles ne bloquent pas le processeur dans un boucle interne au programme. La différence est que le SDL_Timer permet au programme de faire autre chose en attendant un évènement envoyé par le timer, alors que le SDL_Delay ne le permet pas.

    Mais que l'on attende la fin du SDL_Delay, ou que l'on attende l'évènement du Timer sans rien faire d'autre, l'occupation du processeur doit être négligeable dans les deux cas, et les autres tâches du système d'exploitation ne sont pas bloquées. Il faut préciser, dans le cas du timer, que la boucle d'attente des évènements ne doit pas monopoliser tout le CPU, elle doit donc contenir un SDL_Delay. Mais je pense que tous les programmeurs le savent.

    Je crois avoir raison, mais je peux aussi me tromper bien sûr

  11. #31
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par dcmo5 Voir le message
    Il me semble que les deux fonctions rendent la main au système, c'est à dire qu'elles ne bloquent pas le processeur dans un boucle interne au programme. La différence est que le SDL_Timer permet au programme de faire autre chose en attendant un évènement envoyé par le timer, alors que le SDL_Delay ne le permet pas.

    Mais que l'on attende la fin du SDL_Delay, ou que l'on attende l'évènement du Timer sans rien faire d'autre, l'occupation du processeur doit être négligeable dans les deux cas, et les autres tâches du système d'exploitation ne sont pas bloquées. Il faut préciser, dans le cas du timer, que la boucle d'attente des évènements ne doit pas monopoliser tout le CPU, elle doit donc contenir un SDL_Delay. Mais je pense que tous les programmeurs le savent.

    Je crois avoir raison, mais je peux aussi me tromper bien sûr
    Non, comme je disais cela ne fonctionne pas comme cela. Soit le système crée un deuxième thread pour gérer le timer, ou utilise un système de type alarm. Du coup, si le thread principal ne fait pas quelque chose pour libérer le CPU, le programme global sera toujours à 100%.

    Jc

  12. #32
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    Citation Envoyé par fearyourself Voir le message
    T'es sûr qu'il rend la main ? Il me semblerait qu'un simple SDL_Timer ne rendrait pas la main puisque c'est dans le coeur de la SDL qu'il y a une vérification Est-ce qu'on doit exécuter un Timer ? Et je ne vois pas pourquoi un SDL_Delay serait fait dans ce cas là.

    Je peux me tromper bien sûr
    Jc
    je ne suis jamais allé voir mais je penserai qu'un SDL_Delay serait juste un "sleep"
    il faudrait voir dans le code

    sinon en pratique, dans une boucle du fais
    temps = SDL_GetTicks();
    while(running)
    {
    // gestion des events
    // affichage
    // gestion du temps
    do {
    SDL_Delay(1);
    tmp = SDL_GetTicks();
    } while(tmp - temps < 1000);
    temps = SDL_GetTicks();
    }
    cette boucle pompe 100% du cpu si je met en commentaire le SDL_Delay, avec le SDL_Delay la conso baisse

    edit : sous win32, SDL_Delay est un simple sleep, le code linux par contre est beaucoup plus compliqué, il y a 3 méthodes avec des options de compilation
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  13. #33
    Membre éprouvé Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Points : 1 054
    Points
    1 054
    Par défaut
    En tout cas j'ai vérifié dans les sources, SDL_WaitEvent n'est qu'un SDL_PollEvent avec un SDL_Delay dedans.

  14. #34
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par fenkys Voir le message
    En tout cas j'ai vérifié dans les sources, SDL_WaitEvent n'est qu'un SDL_PollEvent avec un SDL_Delay dedans.
    Et une boucle autour pour rester dedans

    Jc

Discussions similaires

  1. problème avec la gestion du temps
    Par jurams dans le forum SDL
    Réponses: 10
    Dernier message: 08/07/2011, 10h24
  2. SDL + Gestion de temps
    Par autregalaxie dans le forum C
    Réponses: 3
    Dernier message: 14/05/2010, 23h57
  3. Aide pour l'analyse d'un problème de gestion de temps
    Par PAINCO dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 03/06/2005, 15h49
  4. [VB.NET] Gestion en temps réel d'une bdd access
    Par qwiskas dans le forum Windows Forms
    Réponses: 6
    Dernier message: 12/02/2005, 19h37
  5. fonction de gestion du temps
    Par fati dans le forum C
    Réponses: 5
    Dernier message: 26/12/2002, 16h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo