Bonjours,
Je poste aujourd'hui car j'ai repéré un gros soucis avec la fonction
sleep.
Deja je tiens a dire que les fonctions
setFrameRateLimit et
setVerticalSyncEnabled ne me conviennent
pas du tout étant donné qu'elles provoquent une discontinuité de l'affichage pour la 1ère (avec des temps
de boucles a chaque fois différents) et une trainée derrières les sprites lors des déplacements rapides
pour la 2ème.
J'ai donc voulu fixer les intervalles d'affichage a l'aide de la fonction sf::sleep.
Et la j'ai fais mon enquête car rien ne fonctionnait comme prévu.
Le test donne donc le résultat suivant :
Code : (juste la partie concercée)
/*Fonctions déplaçant un cube témoin pour analyser la fluidité.
Très simple, et non buguée, elle ajoute simplement 3, ou retire 3 a la
coordonnée x du sprite */
Window.clear(Color(0, 0, 0));
Window.draw(sprite);
t1=tempsAffichage-horloge.getElapsedTime();
t2=horloge.getElapsedTime();
sleep(t1);
std::cout<<"HORLOGE : "<<horloge.getElapsedTime().asMicroseconds()<<std::endl;
Window.display();
std::cout<<"Temps de l'affichage : "<<horloge.getElapsedTime().asMicroseconds()<<" "<<t1.asMicroseconds()<<" "<<t2.asMicroseconds()<<std::endl;
horloge.restart();
Dans ce code j'execute une fonction sleep pour attendre le temps d'affichage moins le temps
correspondant aux étapes depuis le précédent affichage.
La console affiche ensuite les valeurs suivantes :
...
HORLOGE : 29253
Temps de l'affichage : 30357 16579 88
HORLOGE : 29586
Temps de l'affichage : 30693 16514 153
HORLOGE : 29364
Temps de l'affichage : 30660 16615 52
HORLOGE : 29415
Temps de l'affichage : 30725 16636 31
HORLOGE : 29296
Temps de l'affichage : 30913 16624 43
HORLOGE : 29018
Temps de l'affichage : 30087 16631 36
HORLOGE : 29197
Temps de l'affichage : 29860 16629 46
HORLOGE : 29176
Temps de l'affichage : 30515 16626 41
HORLOGE : 28946
Temps de l'affichage : 29978 16625 42
...
Donc en gros, le temps à l'entrée de la fonction sleep tourne autour de 40 millisecondes.
Le temps t1 affiche bien la valeur manquante pour arriver a un temps correspondant
au temps d'affichage (qui est de 0.0166667f secondes - pour un ips voulu d'environ 60).
Jusqu'ici aucun problème, sauf qu'à la sortie de la fonction sleep, l'horloge affiche
environ 29000 millisecondes. Soit une attente presque
deux fois plus longue que celle demandée.
La fonction sleep ne fait donc ici pas son travail correctement, comme dit sur la doc :
"Make the current thread sleep for a given duration."Pouvez vous m'aider, merci !