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 :

[C++][JEU] Maintenir un nombre de Frames/secondes


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité4
    Invité(e)
    Par défaut [C++][JEU] Maintenir un nombre de Frames/secondes
    Bonjour,

    je développe un jeu en 2D avec SDL.

    Pour l'instant, mon jeu fonctionne comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    boucle while infinie // chaque passage correspond à une frame
    {
    		traitement de l'affichage
    		affichage de la frame
    		usleep(un moment) // pour pas faire une boucle folle, qui pompe toute la puissance de la machine
    }
    Mon souhait est que le nombre de Frames/secondes soit le même sur chaque machines.
    Il faut donc donner une variable adéquate au usleep en fonction de la machine.
    Un petit nombre sur une machine faible, et un gros nombre sur une machine puissante.

    Bref, mais là je bloque.

    Avec-vous des idées ?

    Merci et bon jeudi

    déplacé par khayyam90

  2. #2
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 371
    Par défaut Re: [C++][SDL][JEU] Maintenir un nombre de Frames/secondes
    Citation Envoyé par Eldacar
    Mon souhait est que le nombre de Frames/secondes soit le même sur chaque machines.
    Il faut donc donner une variable adéquate au usleep en fonction de la machine.
    Un petit nombre sur une machine faible, et un gros nombre sur une machine puissante
    bien le bonjour,

    attention, il ne faut pas faire de suppositions sur les machines. Tout ce que tu peux modifier c'est ton programme qui doit s'arranger pour tourner toujours à X fps.

    X fps, donc tu connais le temps de chaque frame, en ms
    donc, à la fin de chaque tour de la boucle principale, tu dois faire un sleep (ou un SDL_Delay) du temps restant pour arriver au temps de la frame.

    SDL te donne des fonctions comme SDL_GetTicks, tu peux donc mémoriser l'instant où le tour de boucle boucle a démarré, et l'instant où ton traitement de boucle est terminé. Tu peux donc savoir le temps que le tour de boucle t'a demandé, et rajouter le temps qui manque sous forme de sleep (ou SDL_Delay)

  3. #3
    Invité4
    Invité(e)
    Par défaut
    ah je vois où tu veux en venir, intéressant, oui je vais faire comme ça, merci.
    Bon mon autre problème est que mon prgramme SDL mange trop de ressources.
    Je fais du 10FPS sur mon 2.7Ghz, mais je vois comment optimiser ça... Bref merci à toi et bonne journée.

  4. #4
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Attention on ne fait pas comme ça en général. Là tu bloqueras ton programme et en attendant tu ne peux rien faire.. Plutôt que d'employer des sleep(), les timer se font en récupérant le temps et en affichant tous les tempsCourant + xx.

    Pour un exemple simple de timer voir la

    http://jeux.developpez.com/faq/sdl/?...esse_affichage

  5. #5
    Invité4
    Invité(e)
    Par défaut
    cette solution me plait, néanmoins ça ne fonctionne pas chez moi.

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    unsigned int checkTime = SDL_GetTicks();
    const unsigned int fps = 22;
    void ice_runtime(void)
    {
        while (fishboucle == 1)
        {
            if(SDL_GetTicks() > (checkTime + 1000 / fps) ) // gestion fps
            {
     
                    // on lance la fonction lanceuse de toutes les autres fonctions s'executant au tour
                    oncyclerun();
     
                    // on lance fonctions clavier
                    while(SDL_PollEvent(&event))
                    {
                        switch(event.type)
                        {
                            //Si on veut quitter, avec la croix
                            case SDL_QUIT:
                                fishboucle = 0;
                            break;
                            //Si on vient de relâcher une touche de clavier
                            case SDL_KEYUP:
                                //Et si c'est la lettre q
                                if(event.key.keysym.sym==SDLK_q)
                                    { fishboucle = 0; }
                                //Sinon on lance la fonction clavier
                                    onkeyboardaction(SDL_GetKeyName(event.key.keysym.sym));
                            break;
                        }
                    }
                    checkTime = SDL_GetTicks(); // maj timer des fps
    		}
        }
     
    }
    bref, l'écran reste noir et l'UC tourne à 100%


    EDIT: Dans le while, je fais un std::cout<< checkTime << std::endl;
    et il me retourne 2462953295

  6. #6
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Attention dans le timer ne met que les fonction qui affichent. Là je ne vois que des événements, et une fonction oncyclerun() qui fait quoi ? Bref déjà les événements tu peux les sortir de ce timer.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Par défaut
    question de débutant : il faut de toute façon une boucle infinie qui va consommer un max de cpu meme si on limite a un certain fps ?

  8. #8
    Invité4
    Invité(e)
    Par défaut
    ok Fiquet c'est fait et ça marche, merci

  9. #9
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par jcmag
    question de débutant : il faut de toute façon une boucle infinie qui va consommer un max de cpu meme si on limite a un certain fps ?
    Justement pour l'affichage tu ne fais pas de boucle infinie d'ailleurs pas de boucle du tout. Tu crées juste un timer et tu calcules ensuite ton fps dedans.

    Il n'y a pas de raison de faire de boucle infinie...

  10. #10
    Invité4
    Invité(e)
    Par défaut
    Ouf c'est pas facile d'optimiser son truc, à la base mon jeu 2D tournait à 8fps, j'ai réussi à monter à 20

Discussions similaires

  1. Quel est le meilleur nombre d'images par seconde pour un jeu vidéo ?
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 105
    Dernier message: 18/12/2014, 11h00
  2. Changer nombre des frames
    Par byn1984 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 07/06/2011, 15h08
  3. [CS4] nombre image par seconde
    Par VLDG dans le forum Flash
    Réponses: 8
    Dernier message: 12/03/2010, 16h14
  4. IB et Nombre de requêtes par secondes
    Par lio33 dans le forum Débuter
    Réponses: 5
    Dernier message: 15/09/2005, 16h52

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