A propos du delta time

J’en ai parlé dans certains ateliers mais il me semble important de regrouper ici des explications concernant ce mystérieux delta time !

Vous aurez peut être remarqué que le code de certains ateliers s’exécute plus vite sur votre ordinateur ? Les sprites se déplacent plus vite, les tirs également…

Ceci est dû à la vitesse de votre ordinateur.

Pour schématiser, Love2D exécute la fonction love.update à chaque frame, et sur la plupart des ordinateurs cela se produira environ 60 fois par secondes… Mais sur d’autres ordinateurs, cela se produira plus souvent, sur d’autre cela sera moins souvent (ordinateur lent…).

Du coup, si on se contente d’ajouter 1 à la coordonnée d’un sprite par exemple :

sprite.x = sprite.x + 1

Le sprite se déplacera plus ou moins vite en fonction du nombre frames par secondes (FPS) !

Ordinateur rapide :

1—-2—-3—-4—-5—-6….

Ordinateur lent :

1——–2——–3——-4——–5——–6….

On peut même avoir des changements de vitesse, par exemple si l’ordinateur ralenti subitement suite à un traitement exécuté en arrière plan par le système (Windows ou autre) !

Il y a une solution pour remédier à cela !

La fonction love.update reçoit un paramètre communément appelé « dt », diminutif de « delta time ».

Cette valeur va nous permettre d’adapter notre jeu à la vitesse d’exécution de l’ordinateur qui l’exécute.

Que contient cette variable dt ??

Elle contient, attention concentrez-vous :

=>>>> Le temps qui s’est écoulé depuis la dernière frame !

Ce temps est exprimé en secondes. Donc si le PC tourne à 60 FPS, la valeur tournera à plus ou moins : 0,0166666666666667 secondes 🙂 ! Pourquoi ? Parce que 1/60 = 0,0166666666666667 tout simplement. On peut parler de « 1 soixantième de seconde » si on veut se la péter.

En gros, il s’est écoulé 0.016 secondes depuis le dernier appel de love.update, vous suivez ?

Comment utiliser cette valeur ?

En multipliant nos valeurs de déplacement et de chronomètres par le delta time, on peut rendre proportionnel nos valeurs par rapport à la vitesse d’exécution.

Exemples

Je veux que mon vaisseau se déplace de 10 pixels chaque seconde :

sprite.x = sprite.x + (10 * dt)

Le sprite se déplacera donc d’une fraction de 10 pixels à chaque frame, cette fraction étant elle même une fraction de seconde. Je détaille :

Frame 1 :
0.016 * 10 = 0.16 => Le sprite se déplace de 0.16 pixels, soit au total 0.16

Frame 2 :
0.016 * 10 = 0.16 => Le sprite se déplace de 0.16 pixels, soit au total 0.32

Frame 3 :
0.016 * 10 = 0.16 => Le sprite se déplace de 0.16 pixels, soit au total 0.48

… ETC. …

Répétez cela 60 fois et 1 seconde se sera écoulée sur un ordinateur qui exécute votre jeu à 60 FPS. Le total sera alors de 0.16 x 60, soit environ 10 !
(j’ai simplifié en n’utilisant que 3 chiffres après la virgule, d’où le « environ »)

Sur un PC qui va tourner à 100 FPS, le delta time va tourner autour de 0.1 secondes :

Frame 1 :
0.01 * 10 = 0.1 => Le sprite se déplace de 0.16 pixels, soit au total 0.1

Frame 2 :
0.01 * 10 = 0.1 => Le sprite se déplace de 0.16 pixels, soit au total 0.2

Frame 3 :
0.01 * 10 = 0.1 => Le sprite se déplace de 0.16 pixels, soit au total 0.3

… ETC. …

Répétez cela 100  fois et 1 seconde se sera écoulée sur un ordinateur qui exécute votre jeu à 100 FPS. Le total sera alors de 0.1 x 100, soit 10 !

Autre méthode, je veux que mon vaisseau se déplace de 1 pixels 60 fois par secondes :

sprite.x = sprite.x + (1 * (60*dt))

Dans ce cas, x augmente de 1 à chaque fois que 1/60 de secondes se sera écoulé.

C’est la méthode à appliquer si vous avez codé dans utiliser le delta time et que vous voulez rendre votre code compatible avec les différentes vitesses d’exécution, multipliez juste vos valeurs habituelles par 60*dt !

Autre intérêt du delta time :

Voir cette vidéo :

Dialoguez avec les autres membres de la gamecodeur school.

Accédez maintenant à notre serveur Discord privé : Entraide, Game Jams, Partage de projets, etc.

Vous devez être membre de la Gamecodeur School Premium pour être autorisé à accéder au serveur.