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

API graphiques Discussion :

Problème limitation Framerate (2D)


Sujet :

API graphiques

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 34
    Points : 38
    Points
    38
    Par défaut Problème limitation Framerate (2D)
    Bonjour,

    programmant un petit moteur 2D, j'ai quelques problèmes à insérer la fonctionnalité permettant de limiter le fps à un taux indiqué par l'utilisateur (60 par exemple).

    Voici le simple algorithme, dans la boucle locale des messages :

    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
    while( msg.message != WM_QUIT && !GExit )
        {
    		SetCursor(LoadCursor(NULL, IDC_ARROW));
            if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
            {
    			TranslateMessage( &msg );
                DispatchMessage( &msg );
            }
            else
    		{
    			if( limitFPS )
    			{
    						fps_startTime = timeGetTime();
    						if( fps_startTime >= fps_nextFrame )
    						{
    							if( m_Graphics->DeviceRecup() )
    								GameLoop();
     
    							else if( m_Graphics->getDeviceResettable() )
    								RestoreDevice();
     
    							fps_nextFrame = fps_startTime + fps_waitTime;
    						}
    			}
     
    			else
    			{
    				if( m_Graphics->DeviceRecup() )
    					GameLoop();
     
    				else if( m_Graphics->getDeviceResettable() )
    					RestoreDevice();
    			}
    		}
    	}
    fps_startTime, fps_waitTime, fps_nextFrame sont tous les trois de type DWORD (unsigned long). fps_nextFrame est bien initialisé à 0 dès l'instanciation de la classe l'incorporant. fps_waitTime est initialisé à 1000/(fps demandé) en même temps que l'initialisation à true de limitFPS, via cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void CCore::lockFPS( int framerate )
    {
    	fps_waitTime = 1000 / framerate;
    	limitFPS = true;
    }

    Cet algorithme marche sur un jeu que j'avais créé. Mais ici, je n'ai même pas le problème des arrondis (1000/60 = 16,6666666...), j'obtiens 32 en fps, voire 40 maintenant si je lui indique 60, et 64 en fps si je lui indique un chiffre supérieur à 62 (même si je lui indique 300). Et bien sûr, ça marche si je lui indique un chiffre inférieur à 32.

    Mon PresentParameters :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Initialisation des paramètres du device
        ZeroMemory(&PresentParameters, sizeof(D3DPRESENT_PARAMETERS));
        PresentParameters.FullScreen_RefreshRateInHz = 0;
        PresentParameters.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;
        PresentParameters.SwapEffect                 = D3DSWAPEFFECT_DISCARD;
        PresentParameters.BackBufferWidth            = m_Largeur;
        PresentParameters.BackBufferHeight           = m_Hauteur;
        PresentParameters.BackBufferFormat           = SetFormat;
    	PresentParameters.BackBufferCount			 = 1;
        PresentParameters.Windowed                   = true;
        PresentParameters.EnableAutoDepthStencil     = false;
    Grâce à l'interval_immediate, j'obtiens, sans activer la limitation de fps foireuse, un framerate moyen de 1000 images par secondes sur ce pc. Il n'y a donc pas de problème de ce côté là.

    Est-il possible que ce soit dû à certaines lib que j'ai linké ou je ne sais quoi ? J'utilise fmod sur ce moteur. Est-ce lui qui me bouffe mes images ?

    C'est incompréhensible.

  2. #2
    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
    tu peux indiquer le nombre d'image à ne pas dépasser mais obliger ton animation à fonctionner à 60 fps si ton pc ne suit pas il n'y peux rien
    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.

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 34
    Points : 38
    Points
    38
    Par défaut
    Le même algorithme marche pour une application différente avec plusieurs sprites à l'écran, sur le même pc. J'ai 1000 frames par seconde en debug sur ce pc là, sans locker le fps... Lui dire d'attendre un peu entre chaque frame ne devrait pas poser de problème normalement.

    De plus, il n'y a que l'affichage de deux sprites. Idem si rien n'est affiché.

    Configuration :

    processeur : Athlon xp 2800+
    Carte graphique : ATI Radeon 9600 pro SE
    RAM : 1 go DDR 3200

    Un ordinateur dépassé peut-être, mais surtout pas pour de la 2D...

  4. #4
    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
    c'est ce que j'avais cru comprendre par
    Citation Envoyé par Zacks
    ça marche si je lui indique un chiffre inférieur à 32.
    en même temps, le résultat de 1000/60 n'étant pas un entier, tu n'arriveras pas à atteindre précisément 60fps, d'autant plus que sous windows ou sous linux l'os travaille aussi derrière et à une milliseconde près ton test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( fps_startTime >= fps_nextFrame )
    est invalid et tu repars pour un tour de quelques millisecondes voire quelques dizaines puisque l'os peut (et va très certainement) swapper sur les autres processus qui tournent en tache de fond

    donc au final tu peux limiter ton appli à un certain frame rate mais ça ne fera que tourner autour
    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.

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 34
    Points : 38
    Points
    38
    Par défaut
    Je devrais je pense au moins obtenir un chiffre s'y rapprochant (58 / 59 si j'indique 60 normalement, c'est le cas sur l'autre application qui n'utilise pas mon moteur 2D), et que ce soit proportionnel en fonction de ce que j'indique... mais ce n'est pas le cas.

    Le problème c'est que si je n'arrive pas à limiter le framerate, les jeux ne tourneront pas à la même vitesse sur tous les ordinateurs. La vitesse de déplacement des objets en fonction du temps ne me ferait obtenir que des mouvements saccadés, travaillant en 2D.

    Je me doute bien que mon processus va être désordonnancé pour laisser la place aux autres, mais à ce point là, au point de perdre autant de temps, je ne sais pas. Il y a quand même une demi-seconde qui se volatilise donc c'est étrange...


    [EDIT] : Le problème a été plus que résolu grâce à l'utilisation de QueryPerformanceCounter(), très puissant. Utilisant le sdk directx de décembre 2006, voire Février 2007 sur un autre poste, je n'ai aucune compatibilité avec les machines tournant sous windows ME, 98, 95... Donc ça ne me posera pas de problèmes de compatibilité avec les vieilles, très vieilles machines, dans mon cas.

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

Discussions similaires

  1. Problème Limit in subquery !
    Par Klaitos dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/02/2011, 16h05
  2. Problème limite string 255
    Par Zoro63 dans le forum VBScript
    Réponses: 1
    Dernier message: 08/04/2009, 18h22
  3. Problème limite time
    Par FidoDido® dans le forum C
    Réponses: 5
    Dernier message: 06/06/2008, 21h12
  4. [RegEx] [Problème] Limiter une chaine
    Par AnGe7s dans le forum Langage
    Réponses: 10
    Dernier message: 21/08/2006, 01h09
  5. Réponses: 29
    Dernier message: 26/06/2006, 12h17

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