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 depuis une classe : Réguler les FPS


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Froyok
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 83
    Par défaut SDL depuis une classe : Réguler les FPS
    Impossible de réguler mon framerate à 60 FPS !
    J'ai eu beau chercher, je vois pas du tout ou est le problème (passé ma soirée dernière et cette journée la dessus ) !

    Mon code main fonctionne très bien (le cube tourne sans problèmes, mais je suis à 1800 FPS et j'utilise mon cpu à 100%, donc pas très pratique.)

    Le code :

    Déclarations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Uint32 last_time = SDL_GetTicks();
        Uint32 current_time,ellapsed_time;
        Uint32 start_time;

    Dans le while principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            current_time = SDL_GetTicks();
            ellapsed_time = current_time - last_time;
            last_time = current_time;
     
            angleZ += 0.05 * ellapsed_time;
            angleX += 0.05 * ellapsed_time;
     
            Dessiner();
     
            ellapsed_time = SDL_GetTicks() - start_time;
            if (ellapsed_time < 10)
            {
                SDL_Delay(10 - ellapsed_time);
            }
    Ce code fonctionne en entier (donc pas seulement avec cet extrait).
    Mais il semble que dès que je passe par un objet, ça fous le merdier.
    (Et encore plus bizarre, quasiment la même classe fonctionne très bien en ruby, passé au C++, cela ne fonctionne plus... )
    Et j'ai essayé : déclaration de la sdl dans le main, pas par l'objet, idem avec l'ouverture de la fenêtre.
    Rien ne marche.
    Par contre, si je remplace mon code par celui du sdz, ça passe :\
    Je comprend plus rien.

    Voici mon main :
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    //Basic preprocessor
    #include <iostream>
    #include <string>
    #include <SDL/SDL.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include <cstdlib>
     
     
    //Preprocessor for the engine
    //	Fonctions and class
    #include "SDL_window.h"
    #include "SDL_timer.h"
    #include "dessiner.h"
     
     
    using namespace std;
     
    //Main
    int main(int argc, char *argv[])
    {
    	float timing = 1000.0, fps = 60.0;
    	int frame = 0;
     
    	SDL_window window;
    	window.create_window(); // Open Window
     
    	float angleZ = 0;
    	float angleX = 0;
     
    	dessin(angleZ, angleX);
     
        Uint32 last_time = SDL_GetTicks();
        Uint32 current_time,ellapsed_time;
        Uint32 start_time;
     
    ///////////////////////////////////////////////////////
        while (true)
        {
    		//=====================================
            current_time = SDL_GetTicks();
            ellapsed_time = current_time - last_time;
            last_time = current_time;
            //=====================================
    		window.cleargl(); // Nettoyage opengl
    		window.key(); // Gestion d'évènement clavier/souris/joystick
     
    		//Dessin
    		angleZ += 0.05;
            angleX += 0.05;
    		dessin(angleZ, angleX);
    		//Dessin end
     
    		window.refresh(); // Actualisation de l'écran
     
    		frame++; // Incrémentation du nombre de frames
    		//=====================================
            ellapsed_time = SDL_GetTicks() - start_time;
            if (ellapsed_time < (timing/fps))
            {
                SDL_Delay((timing/fps) - ellapsed_time);
            }
            //=====================================
        }
    ///////////////////////////////////////////////////////
     
    	window.quit(); // Termine la SDL
    	return 0;
    } //End Main
    De même, si je recopie ma version de gestion du framerate (float timing/fps et compagnie) dans le code du tuto du sdz, cela fonctionne. En toute logique mes déclarations fonctionnent donc.

    NOTE : Pour le code du main.cpp, avec ou sans ajout du #include <cstdlib>, aucuns changements. De plus le code du SDZ fonctionne si je remplace cette déclaration préprocesseur par iostream.

    [EDIT] j'avoue, ma méthode de limitation des FPS n'est pas ce qu'il y a de mieux, mais actuellement je n'ai pas trouvé mieux.

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Tu fais quelques erreurs:

    Déjà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            current_time = SDL_GetTicks();
            ellapsed_time = current_time - last_time;
            last_time = current_time;
            //=====================================
            /**
                  code de dessin
            **/ 
     
            //=====================================
            ellapsed_time = SDL_GetTicks() - start_time;
    Déjà ta variable start_time n'est initialisée nulle part, elle ne change pas mais SDL_GetTicks augmente, donc tu auras toujours ellapsed_time > (timing/fps).

    Ensuite tu calcules deux fois ellapsed_time..

    Tu devrais calculer le temps qui reste juste avant le SDL_Delay, pas avant le dessin, donc ça ferait quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            //=====================================
            /**
                  code de dessin
            **/ 
     
            //=====================================
            current_time = SDL_GetTicks();
            ellapsed_time = current_time - last_time;
            last_time = current_time;
            if (.....) {...}

  3. #3
    Membre confirmé Avatar de Froyok
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 83
    Par défaut
    Je te remercie beaucoup, après relecture du code, je me suis rendu compte de l'erreur dont tu signale l'existence : la non initialisation de "start_time", en fait je ne l'avais pas vu car celle-ci se faisait juste avant le code de gestion des évènements !

    Après, je vais être franc, je ne me suis pas plus posé de question que ça, j'ai simplement copié le code (ma priorité n'est pas sur ce point actuellement, mais vu le temps que je viens d'y passer, je crois que je vais finaliser ça afin d'être tranquille par la suite...).

    Encore merci, je vais étudier tes réponses !

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Juillet 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2004
    Messages : 289
    Par défaut
    Citation Envoyé par Froyok Voir le message
    Mon code main fonctionne très bien (le cube tourne sans problèmes, mais je suis à 1800 FPS et j'utilise mon cpu à 100%, donc pas très pratique.)
    Sauf erreur de ma part tu utiliseras toujours ton cpu à 100% à cause de la boucle principale.

  5. #5
    Membre confirmé Avatar de Froyok
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 83
    Par défaut
    [Bon, problème résolu, le moteur tourne bien à 60FPS et pas plus !]
    Sinon, je me permet de te contredire sur certains points Captain_JS, oui, ma boucle principale consommera surement 100% du cpu... quand je ferais de gros calculs et autres (IA, rendu, calcul physiques, etc...), mais actuellement, avec cette régulation des FPS, je ne consomme pour ainsi dire rien.

  6. #6
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    CaptainJS: En fait SDL_Delay libère le CPU pendant le temps que le programme n'est pas utilisé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Couper tous les sons QSound depuis une classe d'options
    Par Alice23 dans le forum Débuter
    Réponses: 1
    Dernier message: 13/01/2012, 13h48
  2. [ZF 1.9] Récupérer les resources (déclarée dans Bootstrap) depuis une classe "hors" MVC
    Par cyrille37 dans le forum Autres composants
    Réponses: 2
    Dernier message: 05/09/2009, 14h28
  3. affichage depuis une classe en utilisant sdl
    Par raph1982 dans le forum Développement 2D, 3D et Jeux
    Réponses: 4
    Dernier message: 09/04/2009, 19h05
  4. Attaquer les méthodes d'un controle depuis une classe
    Par chti_vince dans le forum ASP.NET
    Réponses: 10
    Dernier message: 18/07/2007, 15h04
  5. Consommer les méthodes d'un controle depuis une classe
    Par chti_vince dans le forum ASP.NET
    Réponses: 8
    Dernier message: 12/07/2007, 09h22

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