2010-06-23 20 views
10

J'écris un jeu, et j'ai vu que l'algorithme FPS ne fonctionne pas correctement (quand il doit calculer plus, il dort plus longtemps ...) Donc, la question est très simple: comment calculer le temps de sommeil pour avoir FPS correct?Développement de jeu: Comment limiter les FPS?

Je sais combien de temps il a fallu pour mettre à jour le jeu une image en microsecondes et bien sûr le FPS que je veux atteindre.

Je cherche fou pour un exemple simple, mais je ne peux pas trouver un ....

Le code peut être en Java, C++ ou pseudo ....

+12

généralement vous ne voulez pas limiter votre FPS. Si quelqu'un paie pour une carte graphique extrêmement belle, ils veulent plus de FPS. Vous devez concevoir votre code de sorte qu'il mesure le temps entre les trames (ou même qu'il fonctionne sur une certaine "coche" arbitraire indépendante du framerate) et que les objets du jeu se mettent à jour en fonction de ce temps écoulé. Si vous faites cela correctement, votre jeu jouera de la même manière à 15fps ou 100fps, la seule différence étant la fluidité du mouvement. – rmeador

+2

@rmeador: Il est inutile d'aller plus vite que la fréquence de rafraîchissement du moniteur, qui est généralement de 60 Hz sur les moniteurs TFT (mais cela ne devrait pas être le cas, bien sûr). – Thomas

+1

@rmeador: Mais ça va manger tout le CPU ... –

Répondre

13

Le nombre de microsecondes par trame est 1000000/frames_per_second. Si vous savez que vous avez passé elapsed_microseconds calcul, le temps que vous avez besoin de dormir est:

(1000000/frames_per_second) - elapsed_microseconds 
+0

@JS Bangs: hmm ... même Effet ... Je vais vérifier les fonctions de temps. –

+0

@JS Bangs: En effet, c'était mes fonctions de temps .... Merci –

14

Le temps que vous devrait dépenser sur le rendu d'une image est 1/FPS secondes (si vous visez, disons 10 FPS, vous devriez passer 1/10 = 0,1 secondes sur chaque image). Donc, si cela prend X secondes pour le rendu, vous devriez "dormir" pour 1/FPS - X secondes.

Traduire que de millisecondes d'exemple, vous obtenez

ms_to_sleep = 1000/FPS - elapsed_ms; 

Si ce, pour une raison quelconque a plus de 1/FPS pour rendre le cadre, vous aurez un temps de sommeil négatif dans ce cas, vous évidemment juste sauter le sommeil.

2

Essayez ...

static const int NUM_FPS_SAMPLES = 64; 
float fpsSamples[NUM_FPS_SAMPLES] 
int currentSample = 0; 

float CalcFPS(int dt) 
{ 
    fpsSamples[currentSample % NUM_FPS_SAMPLES] = 1.0f/dt; 
    float fps = 0; 
    for (int i = 0; i < NUM_FPS_SAMPLES; i++) 
     fps += fpsSamples[i]; 
    fps /= NUM_FPS_SAMPLES; 
    return fps; 
} 

... comme par http://www.gamedev.net/community/forums/topic.asp?topic_id=510019

1

Prenez un article sur les différentes méthodes de manipulation du FPS.