38Fermer40
GodzilLe 17/04/2010 à 14:18
GoldenCrystal (./33) :
Godzil (./31) :
Le probleme avec cette boucle, c'est que tu va consommer plus de CPU qu'il ne faut..
T'auras un peu plus de changements de contexte, mais rien de trop dramatique non plus…
il vaux mieux partir sur (comme l'indique le siteduzero, meme si je n'ai aps fait comme ça moi ^^) une base de temps, ie 30ms d'attente, de mesurer le temps que la boucle a prise, et mesurer le temps reel de l'attente et au prochain cycle, avec le delta, fait (30ms + delta) etc...

Oui mais dans la pratique, le temps que va prendre ta gestion des événements est totalement indéterminé, et on compte des trucs de l'ordre de la milliseconde. 1000 / 30 ça fait déjà que 33 FPS au maximum (donc moins dans la réalité).
Tu ne peux pas te permettre d'attendre trop, ça va détruire le jeu.
Un sleep(0) ça n'épargne pas l'usage du CPU, mais ça permet au système de rester fluide. Un sleep( > 0 ) ça va permettre au système de rester fluide, et peut-être même réduire l'utilisation CPU (si c'est possible).
Pour 60 FPS, t'as que 16,6 ms entre deux images, c'est à dire presque rien. Avec une granularité en millisecondes, tu ne peux clairement pas te permettre de faire joujou avec des durées de sommeil variables.
Je rapelle d'ailleurs que un sleep a pour garantie de dormir au moins la durée indiquée (sauf exception genre le programme se fait tuer, etc.), mais ne te spécifie en aucun cas que tu vas dormir exactement la durée spécifiée. Ça sera toujours supérieur.
En plus, mesurer le temps pris par la boucle est une aberration. Tu ne peux pas prédire combien de temps prendra l'abération suivante. Tu vas ralentir le jeu parce que tu as présumé que la prochaine itération allait prendre que 1ms parce que c'était le cas de la dernière, mais en vrai la suivante va faire 20 ms, donc tu auras attendu en réalité (29+20 = )59 ms… Tu me suis ? En gros y'a une frame qui s'évapore dans la nature, sans aucune raison valable.
S'il y a un truc à ne jamais faire, c'est justement ça.
Au même titre que les timer, les sleep ne sont pas (jamais) une source de temps fiable.

Economiser le CPU oui, mais pas au détriment de la réactivité du jeu.

La methode que j'ai cité, c'est celle que j'utilise pour TI-NES et a vrai dire je suis a 60FPS stable, tres stable ^^

(et ça permet de prendre en compte le temps d'execution du code)

Et ton delta peux etre négatif comme positif, tout dépend de des durées d'executions