Bonjour,
D'ores et déjà, je m'excuse si je ne poste pas au bon endroit, mais je considère que ce problème pas forcément d'attrait direct aux interfaces graphiques !
Dans le cadre d'un jeu, je souhaiterais fixer une limitation des FPS. En effet, sans limitation, le jeu tourne à environ 1600 fps, et le processeur prend cher :]
Mon rafraichissement graphique se fait dans un thread séparé, dans une boucle infinie que je temporise.
Cependant, même si dans ma tête tout marche très bien, mais limitation n'est jamais parfaite.
Si je demande 50 FPS, j'en obtiens environ 55.
Si je demande 120 FPS, j'en obtiens environ 130.
Si je demande 200 FPS, j'en obtiens environ 230.
Si je demande 500 FPS, j'en obtiens environ 1000.
Et ainsi de-suite. Les valeurs sont de moins en moins précises.
Voici le code que j'utilise :
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 public void run(){ long time; long nanoTime; long retard = 0; /* long fps = 0; long lastFPSTime = 0; */ for (;;) { try { /* * Un des codes que j'utilise pour calculer les FPS * if (++fps > 20) { System.out.println((1000 * fps) / (System.currentTimeMillis() - lastFPSTime)); lastFPSTime = System.currentTimeMillis(); fps = 0; }*/ nanoTime = System.nanoTime(); // Fonction d'affichage graphicalRender(); /* * J'utilisais ici seulement les millisecondes avant, mais le résultat était identique * J'ai voulu testé avec les micros, et j'ai laissé comme ça.. * * FPS est une variable tq : int FPS = 120; */ nanoTime = 1000000000 / FPS - (System.nanoTime() - nanoTime); time = nanoTime / 1000000; nanoTime -= time * 1000000; /* Avec ou sans retard, les fps varient toujours autant */ time += retard; retard = 0; if (time > 0 || time == 0 && nanoTime > 0) { sleep(time, (int) nanoTime); } else { retard = time; } } catch (Exception e) {} } }
Je n'arrive pas à voir en quoi ma temporisation est imparfaite.
Si je souhaite <FPS> fps, il faut que j'ai un rafraichissement tous les 1 / <FPS> secondes, donc chaque "boucle" doit prendre 1/<FPS> secondes.
Si je fais <T> secondes de traitement, je dois attendre 1/<FPS> - <T> secondes avant de recommencer..
Si vous avez la solution miracle, je suis preneur :]
Partager