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 :
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
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(); } } }
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 :
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à.
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;
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.
Partager